我不知道异步任务的细节,
我最近在我的项目中使用异步任务从服务器端获取一些数据,并根据结果更新我的UI,我以通常的方式实现了一个进度对话框,并在我的onPostExicute方法中像这样删除它
@Override
protected void onPostExecute(ArrayList<StationSlots> result) {
try {
publishProgress(100);
WizardStep4.retStationSlots = result;
if (WizardStep4.this.dialog != null) {
WizardStep4.this.dialog.dismiss();
}
} catch (Exception e) {
}
}
但是我发现一些代码做了同样的事情,但是在ui线程上执行动作,就像这样
@Override
protected void onPostExecute(ArrayList<StationSlots> result) {
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
publishProgress(100);
WizardStep4.retStationSlots = result;
if (WizardStep4.this.dialog != null) {
WizardStep4.this.dialog.dismiss();
}
} catch (Exception e) {
}
}
});
}
我想知道哪一种是最好的方法,它们有什么区别?
AsyncTask
的错误实现方法。
protected void onPostExecute(ArrayList<StationSlots> result)
已经在MainUiThread上运行了,所以你不必在OnPostExecute()
上写runOnUiThread(new Runnable()
。
也publishProgress();
是用来更新UI从doInBackground()
的AsyncTask,因为它在一个工作线程上运行。当你从doInBackground()
调用publishProgress();
时,onProgressUpdate(Integer... progress)
也会在MainUIThread上运行,所以你不需要在AsyncTask中的runOnUiThread(new Runnable()
。(除非你想从doInBackground()
更新UI而不调用publishProgress();
)