在一个场景中,我有一个UI需要从另一个线程(使用AsyncTask)进行更新。我可以将AsyncTask定义为活动的内部类,但这有两个缺点,我觉得很棘手:
- 它使源文件非常大,降低了管理代码的效率
- 它使重用线程类变得困难
首先要注意的是,在使用 AsyncTask
时,不能在 doInBackground()
中进行 UI 操作。
您可以通过在 doInBackground()
中调用 publishProgress(values)
来更新长时间运行的后台作业的状态。运行时会为这些值调用您的 onProgressUpdate(values)
回调函数,在 UI 线程中执行,从中您可以更新用户界面。
您可以查看例如https://github.com/pilhuhn/ZwitscherA/blob/master/src/de/bsd/zwitscher/TweetListActivity.java#L336以获取示例代码。
可以在自己的类文件中实现 AsyncTask。
我看到的很多例子只是将Context
传递到AsyncTask
的构造函数中。
public class BackgroundStuff extends AsyncTask<Void, Void, Void> {
...
Context mContext;
...
BackgroundStuff(Context context){
super();
this.mContext = context;
}
...
}
我很想听听是否有其他人使用过其他方法。
我对AsyncTasks有一种有点奇怪的观点,因为我通常更喜欢使用普通的线程,但基本上我执行后台任务并更新UI的方式是在onCreate()方法的末尾创建一个Handler,然后覆盖handleMessage(Message msg)方法。
然后在我的线程中,我将Handler作为参数传递进去,然后当我希望进行更新时,我会从线程向Handler发送一条消息,现在这样做的作用是从新的后台线程通信到UI线程以处理UI上的工作。
现在我想象AsyncTasks执行类似的任务,但消除了实现覆盖Handlers' handleMessage方法的需要。
学习这两种方法之间的任何优缺点都会很有趣。