0

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

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

4

3 回答 3

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();
    }
  }
}
于 2013-02-23T00:08:07.027 回答
1

听起来您想让 Activity 在加载器线程加载数据时显示一些信息?所以你需要将一些信息从 loader 传递到 Activity 中,更新 UI。在这种情况下,我不确定您是否需要 Activity 中的第二个 AsyncTask(和关联的线程),因为您仍然需要将数据获取到主线程,然后才能更新 UI。相反,您应该按照JRaymond 的建议进行操作,只需使用publishProgress将更改推送到主线程并在onProgressUpdate的主线程上处理它们

如果你需要更通用的东西,你也可以考虑使用 java.util.concurrent。例如,可以使用 BlockingQueue 来实现消费者/生产者模式。有关代码片段,请参阅Javadoc 。

于 2013-02-23T00:12:03.207 回答
0

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

从文档:

首次引入时,AsyncTask 在单个后台线程上串行执行。从 DONUT 开始,这被更改为允许多个任务并行运行的线程池。从 HONEYCOMB 开始,任务在单个线程上执行,以避免并行执行导致的常见应用程序错误。

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

于 2014-04-17T22:42:55.587 回答