活动 - > AsyncTask - > BroadcastReceiver - >更新UI

时间:2013-08-06 00:08:27

标签: android android-asynctask broadcastreceiver

我从AsyncTask开始Activity。当AsyncTask完成执行时,我需要发送一个需要调用Activity方法来更新UI的广播。

任何实现这一目标的好方法。

3 个答案:

答案 0 :(得分:4)

如果AsyncTask是您Activity的内部类,则它可以访问任何成员变量和Activity方法。如果不是,那么您只需将变量传递给其构造函数,甚至可以引用Activity来调用Activity中的onPostExecute()方法。没有任何代码,很难说其他很多。

要传递Activity的实例并使用其方法(如果它是一个单独的类),那么您可以创建一个构造函数并执行类似

的操作
    public class MyTask extends AsyncTask<...>  // add your params
{
    private MyActivity activty;

    public MyTask (MyActivity act)
    {
        this.activty = activty;
    }

    // ...
}

并在onPostExecute()中添加类似

的内容
activity.myMethod();

并调用任务

MyTask task = new MyTask(this); // pass a reference of the activity
task.execute();  // add params if needed

如果AsyncTask是与Activity分开的单独文件,那么您callback可以see this answer on how to use an interface

答案 1 :(得分:3)

请使用界面。

interface INotifyChange {
    void notifyChange(); // You can use params to transfer data :D
}

活动中,您应该实现此界面

YourActivity  extends Activity implements INotifyChange {

    @Override
    public void notifyChange() {
        // Right here, you can Update UI.
    }
}

创建 AsyncTask

的新实例时

示例:

YourAsyncTask mTask = new YourAsyncTask(this); // You put INotifyChange

YourAsyncTask

private INotifyChange iNotifyChange;
public YourAsyncTask(INotifyChange iNotifyChange) {
    this.iNotifyChange = iNotifyChange;
}

//当您完成doInBackground或任何想要更新UI的地方时,请使用 iNotifyChange.notifyChange()

示例:

@Override
public void onPostExecute(ResultType mResult) {
    iNotifyChange.notifyChange();
}

通过这种方式我经常用来更新进度条。在这种情况下,我在我的方法中使用参数:

示例:

iNotifyChange.notify(progress);

答案 2 :(得分:1)

您是否考虑过覆盖AsyncTask的onPostExecute()方法来更新UI?尝试这样的事情:

AsyncTask<String, Void, Bitmap> task = new AsyncTask<String, Void, Bitmap>(imageView)
{
    private ImageView imageView;

    public AsyncTask(ImageView imageView)
    {
         this.imageView = imageView;
    }

    @Override
    protected Bitmap doInBackground (String... params)
    {
        if(params.length > 0)
        {
            String filePath = params[0];

            // Load Bitmap from file

            return bitmap;
        }
    }

    @Override
    protected void onPostExecute(Bitmap result)
    {
       imageView.setImageBitmap(result);
    }
}
task.execute(filePath);