【问题标题】:Activity -> AsyncTask -> BroadcastReceiver -> Update UI活动 -> AsyncTask -> 广播接收器 -> 更新 UI
【发布时间】:2013-08-06 20:20:54
【问题描述】:

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

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

【问题讨论】:

  • 我认为,这种情况最好使用观察者模式。

标签: android android-asynctask broadcastreceiver


【解决方案1】:

是的。

如果AsyncTaskActivity 的内部类,那么它可以访问任何成员变量和Activity 方法。如果不是,那么您可以简单地将变量传递给它的构造函数,甚至是对Activity 的引用,以从onPostExecute() 调用Activity 方法。没有任何代码很难说别的。

要传递您的 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 不同的文件,那么您可以通过see this answer on how to use an interface 获得callback

【讨论】:

    【解决方案2】:

    请使用接口。

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

    Activity中你应该实现这个interface

    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);
    

    【讨论】:

      【解决方案3】:

      您是否考虑过覆盖 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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多