如何从Android AsyncTask进行活动UI更改?

时间:2011-01-29 11:57:10

标签: android oop android-asynctask

在我有一个将从单独的线程更新的UI(使用AsyncTask)的情况下,我可以将AsyncTask定义为活动的内部类,但这有两个缺点我发现有问题:

  1. 它使源文件非常大,降低了管理代码的效率
  2. 这使得重用线程类
  3. 变得困难

    什么是好的解决方案?使用内部类,但将它所做的一切都抽象到其他类?将对Activity的引用传递给AsyncTask?总是将AsyncTask类定义为内部类,只接受源文件会很大吗?

3 个答案:

答案 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方法。

了解这两种方法之间的任何优点/缺点会更有趣。