2012-11-13 121 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