如何从Android的AsyncTask活动的UI更改?

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

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

什么是一个好的解决scheme? 使用内部类,但抽象的一切,其他类? 将引用传递给AsyncTask? 总是将AsyncTask类定义为内部类,只接受源文件会很大?

Solutions Collecting From Web of "如何从Android的AsyncTask活动的UI更改?"

我见过的很多例子只是将一个Context传递给AsyncTask的构造函数。

 public class BackgroundStuff extends AsyncTask<Void, Void, Void> { ... Context mContext; ... BackgroundStuff(Context context){ super(); this.mContext = context; } ... } 

我会有兴趣听到其他人是否使用其他方法。

首先,当使用AsyncTask您不能在doInBackground()执行UI活动。

你可以做的是 – 如果你想要例如更新一个长时间运行的后台作业的状态,就是从doInBackground()中发布一个publishProgress(values) )。 然后,运行时将为这些值调用onProgressUpdate(values)callbackonProgressUpdate(values) ,该callbackonProgressUpdate(values)在UI线程中运行,以及从哪里更新UI。

看看例如https://github.com/pilhuhn/ZwitscherA/blob/master/src/de/bsd/zwitscher/TweetListActivity.java#L336看看一个例子&#x3002;

AsyncTask可以在自己的类文件中实现。

我有一个与AsyncTasks有点奇怪的POV,因为我通常更喜欢使用正常的线程,但本质上我执行后台任务和更新UI的方式是在onCreate()方法的末尾创build一个Handler,然后我将覆盖handleMessage (Message msg)方法。

然后在我的线程中,我将传递Handler作为参数,然后当我想要更新时,我将从线程发送一个消息给Handler,现在这个function是从新的后台线程传递到UI线程来处理UI上的工作。

现在我想象AsyncTasks执行一个类似的任务,但是不需要实现重载Handlers的handleMessage方法。

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