0

私が達成しようとしているのは、実行中のasynctask(doInBackground)間でデータを共有することです。だから何が起こっているのかというと、アクティビティの情報を更新するために使用する独自のAsyncクラスでデータとアクティビティをロードする別のクラス(Asynctaskを拡張する)があります。基本的に私が達成しようとしているのは、アクティビティ内のスレッド(監視スレッド)がローダーと一緒に動作し、ローダークラスからのデータを提供し、ローダーの準備ができたら「監視」と「ローダー」の両方が停止することです。

インターフェイスを使用して設定した揮発性変数を試してみましたが、スレッド間で情報を共有できないようです(非同期タスク)。何か提案はありますか?たぶん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

データがローダースレッドによってロードされるときに、アクティビティに情報を表示させたいようですが?そのため、ローダーからアクティビティにいくつかの情報を渡して、UIを更新する必要があります。この場合、UIを更新する前にデータをメインスレッドに取得する必要があるため、アクティビティに2番目のAsyncTask(および関連するスレッド)が必要かどうかはわかりません。代わりに、JRaymondが提案するように実行し、 publishProgressを使用して変更をメインスレッドにプッシュし、onProgressUpdateのメインスレッドで処理する必要があります。

より一般的なものが必要な場合は、java.util.concurrentの使用を検討することもできます。たとえば、BlockingQueueを使用して、消費者/生産者パターンを実装できます。コードスニペットについては、Javadocを参照してください。

于 2013-02-23T00:12:03.207 に答える
0

すべての非同期タスク(提供されたエグゼキューターで実行されない限り)は同じバックグラウンドスレッドで実行されるため、それらを同時に実行することはできません。

ドキュメントから:

最初に導入されたとき、AsyncTasksは単一のバックグラウンドスレッドでシリアルに実行されていました。DONUT以降、これはスレッドのプールに変更され、複数のタスクを並行して操作できるようになりました。HONEYCOMB以降、並列実行によって引き起こされる一般的なアプリケーションエラーを回避するために、タスクは単一スレッドで実行されます。

本当に並列実行が必要な場合は、THREAD_POOL_EXECUTORを使用してexecuteOnExecutor(java.util.concurrent.Executor、Object [])を呼び出すことができます。

于 2014-04-17T22:42:55.587 に答える