1

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

任何好的方法来实现这一点。

4

3 回答 3

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

于 2013-08-06T00:19:52.257 回答
3

请使用接口。

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

Activity你应该实现这个接口

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);
于 2013-08-06T00:25:53.047 回答
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);
于 2013-08-06T00:20:45.970 回答