4

HTTPRequestsたとえば、いくつかを使用するアプリがあります

  • セッション ID を取得する

  • 位置データを取得する

  • 既存のカテゴリを取得する

  • (...) その他

HTTPRequestHandler基本的にすべての for each Request を管理するを作成しましたAsynTasks...これはうまく機能しますが、私の問題は、さまざまな を管理するための良い方法がわからないことAsynTasksです。たとえば、 をSessionId Task開始する前にを取得する必要があります。GetSomeLocationData Task

だから私の中には、次のようHTTPRequestHandlerに依存して始まるキューがありますAsyncTasks:

private void startSessionIdTask(...) {
    //...
    GetSessionIdTask mGetSessionIdTask = new GetSessionIdTask(this);
    mGetSessionIdTask.execute(url);
}

//and from the postExecute() in GetSessionIdTask I call
public void setSessionId(int mSessionId) {
    mDataHelper.setmSessionId(mSessionId); //set id


    String url = API_URL + API_GET_FAVORITES + URL_VARIABLE;

    List<NameValuePair> params = new LinkedList<NameValuePair>();
    params.add(new BasicNameValuePair("session_id", getSessionId()));
    String paramString = URLEncodedUtils.format(params, "utf-8");
    url += paramString;

    //and finally start another Tasks (and so one...)
    GetLocationsTask mGetLocationsTask = new GetLocationsTask(this);
    mGetSessionIdTask.execute(url);

}

ただし、これは問題なく動作しますが、(接続によっては) このキューに時間がかかり、AsynTasks最初のデータがまだロードされていないため、ユーザーが失敗する他のキューを開始できるという問題があります。

ブール値のようなものを設定isSessionIdLoadedしたり、ユーザーの UI をブロックしたりできますが、もっと良い解決策があるかどうか疑問に思っています。

だから私の質問は次のとおりです。連続して実行されるある種のキュー(ArrayList、Map ..)に非同期タスクを入れる方法はありますか?

4

3 に答える 3

1

Android 3 以降では、AsyncTasks は でシリアルに実行されAsyncTask.SERIAL_EXECUTORます。したがって、デフォルトで 2 つの AsyncTasks を開始すると

task1.execute();
task2.execute();

Task2 は、task1 が終了した場合にのみ実行されます (SDK の実装を確認してくださいAsyncTask.SERIAL_EXECUTOR)。これは、何らかの理由でタスク 1 が終了しない場合、タスク 2 が開始されず、アプリがデッドロックするという時点までプッシュすることができます。

デフォルトのSERIAL_EXECUTORから独立した独自のキューが必要な場合は、次を使用してください

public final AsyncTask<Params, Progress, Result> executeOnExecutor (Executor exec, Params... params)

そして、独自のエグゼキューター (別名スレッドプール) を提供します。あるプロジェクトでは、SERIAL_EXECUTOR 実装をコピーして 2 つのシリアル キューを作成しました。

Android 2.3 から 1.6 の場合、すべてのタスクはデフォルトで並列であり、Android 3+ での呼び出しに似ています。

task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,null);

残念ながら、Android 2.3 以下では、タスク/スレッドが実行されるエグゼキュータを指定するオプションがありません。したがって、連続して実行したい場合は、タスク 1 が明示的に終了した後にのみタスク 2 を呼び出して、自分で実装する必要がありますonPostExecute()。もちろん、この概念は、前のタスクが終了時に次のタスクを呼び出すタスクのキュー (= シリアル ワーカー キュー) を使用するようにプッシュできます。これについては、多くの文献とパターンを見つけることができます。

于 2013-06-26T21:53:04.003 に答える
0

あなたが何を求めているのか完全にはわかりませんが、ランナブルをキューに入れ、バックグラウンドスレッドで順番に実行する方法Executors.newSingleThreadExecutor()が必要な場合は、探しているものかもしれません. 必要以上に複雑ですが、例やチュートリアルは Google で簡単に見つけることができます。

于 2013-05-06T20:31:24.540 に答える