在我有一个将从单独的线程更新的UI(使用AsyncTask)的情况下,我可以将AsyncTask定义为活动的内部类,但这有两个缺点我发现有问题:
什么是好的解决方案?使用内部类,但将它所做的一切都抽象到其他类?将对Activity的引用传递给AsyncTask?总是将AsyncTask类定义为内部类,只接受源文件会很大吗?
答案 0 :(得分:13)
首先:使用AsyncTask
时,您不得在doInBackground()
内执行UI活动。
你可以做的是 - 如果你想要,例如更新后台作业的状态是来自doInBackground()的publishProgress(values)
。
然后,运行时将为这些值调用onProgressUpdate(values)
回调,该回调在UI线程中运行,并且您可以从中更新UI。
看看例如https://github.com/pilhuhn/ZwitscherA/blob/master/src/de/bsd/zwitscher/TweetListActivity.java#L336看一个例子。
AsyncTask可以在自己的类文件中实现。
答案 1 :(得分:2)
我看到的很多例子只是将Context
传递给AsyncTask
的构造函数。
public class BackgroundStuff extends AsyncTask<Void, Void, Void> {
...
Context mContext;
...
BackgroundStuff(Context context){
super();
this.mContext = context;
}
...
}
如果有其他人使用任何其他方法,我会很有兴趣。
答案 2 :(得分:0)
我有一个奇怪的POV与AsyncTasks,因为我通常更喜欢使用普通的线程,但基本上我执行后台任务和更新UI的方式是在onCreate()方法结束时创建一个Handler,然后我会覆盖handleMessage(Message msg)方法。
然后在我的Thread中,我将Handler作为参数传递,然后当我想进行更新时,我将从线程向Handler发送一条消息,现在这样做是从新的背景进行通信线程到UI线程上以处理UI上的工作。
现在我想象AsyncTasks执行类似的任务,但不需要实现覆盖Handlers的handleMessage方法。
了解这两种方法之间的任何优点/缺点会更有趣。