2011-01-29 24 views
9

在这样一个场景,我有一个从(使用的AsyncTask)一个单独的线程中更新了用户界面,我可以定义的AsyncTask作为一个内部类的活动,但这样做有两个缺点我觉得有问题:如何从Android AsyncTask中进行活动UI更改?

  1. 这使得源文件非常大,降低了管理代码
  2. 这使得它难以重用线程类

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

回答

2

我看到的很多例子只是将Context传递给AsyncTask的构造函数。

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

我很想听听有没有人使用其他方法。

+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可以在自己的类文件中实现。

+0

doInBackground()方法无法访问UI,如果它尝试,框架将引发异常。但我的问题更多地涉及AsyncTask子类实际访问UI的方式。 –

+0

@Olli这就是我说的:doInBackgrround()不能访问UI。或者在onPre | PostExecute()之前或之后通过发布进度来完成。这三种回调方法都允许访问我最初使用Handler的UI –

0

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

然后在我的线程中,我将Handler作为参数传递,然后当我希望进行更新时,我会从线程向Handler发送消息,现在它所做的是从新的背景线程到UI线程以处理UI上的工作。

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

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

+0

,但我只是没有用它凝胶化,尽管这是一个完全主观的感觉。我喜欢AsyncTask的清晰度,并且我通常将它们分开为单独的类(而不是内部类),这有助于我使用它,并使Activity子类更易于管理。 –