Android在运行asynctasks之间交换数据

时间:2013-02-22 23:57:29

标签: java android asynctaskloader

我想要实现的是在运行asynctask(doInBackground)之间共享数据。 所以发生的事情是我有单独的类(扩展Asynctask),它使用自己的Async类加载数据和活动,我用它来更新活动中的信息。基本上我想要实现的是活动中的线程(监视线程)与加载器一起工作并从加载器类提供一些数据,当加载器准备就绪时,“监视”和“加载器”都应该死掉。

我尝试使用接口设置的volatile变量,但没有成功我似乎无法在线程之间共享信息(asynctasks)..有什么建议吗?也许需要一个Exchanger课程?

3 个答案:

答案 0 :(得分:1)

您无法使用onProgressUpdate功能的任何原因?我可能会对你的用例感到困惑......但是一个例子可能如下:

class MyActivity extends Activity {

  private AsyncTask<Uri,MyDataObject, MyResult> = new AsyncTask<Uri,MyDataObject, MyResult>() {
    private MyResult mResult;

    protected MyResult doInBackground(Uri... uris) {           
      int count = urls.length;
      mResult = new MyResult()

      for (int i = 0; i < count; i++) {
        MyDataObject anObject = mDataLoader.getObject(uris[i]);
        publishProgress(anObject);

        mResult.add(anObject);
        // Escape early if cancel() is called
        if (isCancelled()) break;
      }
      return totalSize;
    }

    protected void onProgressUpdate(MyDataObject... data) {
      addDataToUI(data[0]);
    }

    protected void onPostExecute(MyResult result) {
      Toast.makeText("All Done!", Toast.LENGTH_LONG).show();
    }
  }
}

答案 1 :(得分:1)

听起来你想让Activity显示一些信息,因为数据是由加载器线程加载的?因此,您需要将一些信息从加载器传递到Activity,更新UI。在这种情况下,我不确定在Activity中是否需要第二个AsyncTask(和关联的线程),因为在更新UI之前仍需要将数据提供给主线程。相反,您应该执行JRaymond suggests并使用publishProgress将更改推送到主线程,并在onProgressUpdate

中的主线程上处理它们

如果你需要更通用的东西,你也可以考虑使用java.util.concurrent。例如,BlockingQueue可用于实现消费者/生产者模式。请参阅the Javadoc for a code snippet

答案 2 :(得分:0)

所有异步任务(除非使用提供的执行程序执行)都在同一个后台线程上运行,因此无法同时执行它们。

来自文档:

  

首次引入时,AsyncTasks在单个上串行执行   背景线程。从DONUT开始,这被改成了一个池   允许多个任务并行运行的线程。从...开始   HONEYCOMB,任务在单个线程上执行以避免常见   并行执行导致的应用程序错误。

     

如果您真的想要并行执行,可以调用   executeOnExecutor(java.util.concurrent.Executor,Object [])with   THREAD_POOL_EXECUTOR。