再一次,关于ayncTask的另一个问题。我在下面做的是正确的吗?
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();
}
}
基本上我有一个“person”变量,它在activity类中,同一个变量用于插入DB并在DoInBackground中更新它的ID,同一个变量用于GUI目的
我能这样做吗?我尝试了它并且它有效,但这是我不应该做的事情吗?
由于
答案 0 :(得分:1)
您应该使用AsyncTask中可用的类型。而不是<Void, Void, Void>
使用<Person, Void, Person>
然后你的doInBackground将一个人作为参数并返回类型Person。 onPostExecute也将Person作为参数。
答案 1 :(得分:1)
就在AsyncTask
和UI线程之间共享变量而言,唯一的问题是同步。如果在Person
中访问对象时,UI线程(或任何其他线程)可能正在更新doInBackground
对象,则需要同步或以其他方式协调访问。如果在AsyncTask
执行期间,您可以保证对共享Person
对象的唯一访问不会修改对象,那么您可以省去同步。
但是,您应该了解使用AsyncTask
作为Activity
的内部类的一般问题。如果您的活动因任何原因(例如,用户旋转电话等配置更改)重新启动,则AsyncTask
更新将不再有效的活动。 here描述了问题的描述以及有关如何处理的一些建议。
有关此问题的更多讨论,请参阅here,其中包括在活动重启期间维护AsyncTask
进度对话框的方法。