2012-11-13 177 views
0

同樣,有關ayncTask的另一個問題。我正在做的事情正確嗎?asyncTask中的共享變量

Class UpdatePersonActivity{ 

    Person person; 
. 
. 
. 
. 
.  

    private class UpdatePersonAsyncTask extends AsyncTask<Void, Void, Void> { 

     private ProgressDialog dialog; 
     private DBHandler dbHandler; 


     @Override 
     protected void onPreExecute() { 

      dialog = ProgressDialog.show(UpdatePersonActivity.this, "Please wait..", "working..", true); 
      dbHandler = new DBHandler(UpdatePersonActivity.this); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      dbHandler.open(); 
      long id = dbHandler.updatePerson(person); 
         person.setId(id); 
      dbHandler.close(); 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 

      dialog.dismiss(); 
      Toast.makeText(UpdatePersonActivity.this, "Tenant "+person.getName()+" has been updated successfully!", Toast.LENGTH_SHORT).show(); 
      finish(); 

     } 
    } 

基本上我有「人」變量這是在活動類和相同的變量被用來插入到DB和在DoInBackground更新其ID和相同的變量用於GUI目的

我可以這樣做嗎?我試過了,它可以工作,但這是我不應該做的事情?

謝謝

+0

警告,在更新doInbackground()中的人時可能會出錯。 最好使用publishProgress(值) 和onProgressUpdate(值)回調,你可以更新個人 – 2012-11-13 05:16:08

回答

1

只要在AsyncTask和UI線程之間共享一個變量,唯一的擔心就是同步。如果在線程doInBackground中訪問對象時,UI線程(或任何其他線程)可能正在更新您的對象,則需要同步或以其他方式協調訪問。如果在執行AsyncTask時確保只有對共享的Person對象的訪問才能修改對象,則可以免除同步。

但是,您應該知道使用AsyncTask作爲Activity的內部類的一般問題。如果您的活動由於任何原因(例如,用戶旋轉手機等配置更改)而重新啓動,則AsyncTask更新的活動將不再有效。對該問題的描述以及如何處理該問題的一些建議被描述爲here

有關此問題的更多討論,請參閱here,其中包括在整個活動重新啓動期間維護AsyncTask的進度對話框的方法。

+0

+1有關同步 – 2012-11-13 05:17:40

+0

完善的建議。這正是我正在尋找的那種答案 – Snake

1

您應該使用AsyncTask中可用的類型。而不是<Void, Void, Void>使用<Person, Void, Person>然後你的doInBackground將把一個人作爲參數,並返回類型Person。 onPostExecute也會將Person作爲參數。

+0

+1關於如何做到這一點 – Snake