我不知道异步任务的细节,我最近在我的项目中使用异步任务从服务器端获取一些数据并根据结果更新我的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) {
}
}
});
}
我想知道哪种方法最好,有什么区别?
答案 0 :(得分:4)
AsyncTask
的错误实施方法。
protected void onPostExecute(ArrayList<StationSlots> result)
已经在 MainUiThread 上投放,因此您无需在runOnUiThread(new Runnable()
中撰写OnPostExecute()
。
此外,publishProgress();
用于在工作线程上运行AsyncTask的doInBackground()
更新UI。当您致电publishProgress();
表单doInBackground()
时,执行onProgressUpdate(Integer... progress)
也将在 MainUIThread 上运行,因此您不需要runOnUiThread(new Runnable()
在AsyncTask中。 (除非您要在不调用doInBackground()
的情况下从publishProgress();
更新UI)