我一直在阅读使用 AsyncTask 类来执行更短的后台操作,以及用于长期操作的服务。
那么在 Android 中使用 AsyncTask 类时通知 UI 后台进程更改的最佳实践是什么?我应该使用经典的 MVC 模型并创建一个侦听器(最好在扩展 Application 类的类中)还是在 Android 中有一种标准的方法?
我已经阅读了AsyncTask 参考,似乎方法 onProgressUpdate() 仅在例如在任务本身中使用 ProgressDialog 时才有用。
谢谢!
我一直在阅读使用 AsyncTask 类来执行更短的后台操作,以及用于长期操作的服务。
那么在 Android 中使用 AsyncTask 类时通知 UI 后台进程更改的最佳实践是什么?我应该使用经典的 MVC 模型并创建一个侦听器(最好在扩展 Application 类的类中)还是在 Android 中有一种标准的方法?
我已经阅读了AsyncTask 参考,似乎方法 onProgressUpdate() 仅在例如在任务本身中使用 ProgressDialog 时才有用。
谢谢!
如果要更新的组件是启动更新作业的组件(通过 AsyncTask 或 Service),您可能应该使用内部AsyncTask
AsyncTask 为您提供了两种更新 UI 的可能性:
请参阅:
doInBackground()
publishProgress()
onProgressUpdate()
onPostExecute()
编辑 :
public class Home extends Activity implements OnClickListener {
private Button mButton;
private TextView mTextView;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_layout);
mButton = (Button) findViewById(R.id.myButton);
mTextView = (TextView) findViewById(R.id.myTextView);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.myButton:
(new MyAsyncTask()).execute();
break;
default:
break;
}
}
private class MyAsyncTask extends AsyncTask<String, int[], Boolean> {
/** This method runs on a background thread (not on the UI thread) */
@Override
protected String doInBackground(String... params) {
for (int progressValue = 0; progressValue < 100; progressValue++) {
publishProgress(progressValue);
}
}
/** This method runs on the UI thread */
@Override
protected void onProgressUpdate(Integer... progressValue) {
// TODO Update your ProgressBar here
mTextView.setText("Updating : " + progressValue + "/100");
}
/**
* Called after doInBackground() method
* This method runs on the UI thread
*/
@Override
protected void onPostExecute(Boolean result) {
// TODO Update the UI thread with the final result
mTextView.setText("Update complete !");
}
}
}
您可以在此处找到另一个示例。
OnProgressUpdate 是要走的路。当您声明 AsyncTask 的实现时,您可以定义一个要通过 onProgressUpdate 发回的对象,该对象可以被处理以向您的 UI 发送更新。否则,如果您在尝试更改 UI 时实现侦听器,您将遇到线程冲突,因为 AsyncTask 是在应用程序主线程之外的线程中执行的。onProgessUpdate 中的任何代码都在调用者主线程中执行,因此它可以毫无问题地更新 UI
AsyncTask 与服务 - 当结果是您的活动本地时使用 AsyncTask - 当其他活动不需要您的任务结果时。当他们这样做时使用服务。
使用 onPorgressUpdate 在 AsyncTask 中提供增量状态通知 - 任务尚未完成时的任何通知。有关任务完成时间的通知,请使用 onPostExecute。监听器也可能是合适的,但前提是您需要通知在编译时不一定知道的特定类,而不是发布状态更新的通用方式。