12

FragmentsとLoaderManagerを使用しています。不明な数のタスクを起動する必要があり、それらは並行して実行される可能性があります(そうでない場合は、1つのローダーのみを再利用します)。たとえば、リストビューがあり、各行にその行のコンテンツをWebサーバーに保存するためのボタンがある場合があります。ユーザーは、複数のアイテムに対して並行して保存要求を開始できます。

private int nextId = 0;

private void onClickListener() {
    Bundle bundle = new Bundle();
    bundle.putNextData(...);
    getLoaderManager().initLoader(nextId++, bundle, this);
}

自分で簿記を試すことができるので、ローダーのプールを手動で作成し、可能な場合はそれらを再利用します。これは、APIによってすでに実装されている可能性がありますか?

ありがとう

4

3 に答える 3

4

リモートサーバーにデータを保存するためにローダーを使用するべきではないと思います。

代わりに、IntentServiceまたは同様の何かを使用して、「保存」操作のキューを処理します。このようにして、Webサーバーとの通信をバッチ処理して折りたたむことができ(つまり、1つのアイテムの複数のキューに入れられた保存を1つの操作に折りたたむことができ)、必要に応じてアクティビティの存続期間を超えて存続します。

(または同等の)によって処理される保存キューIntentServiceは、を使用して指数バックオフで遅延再試行を実装できるため、バックオフで失敗した操作を再試行するための優れた方法でもありますAlarmManager

于 2012-08-17T19:16:37.637 に答える
1

IntentService またはバインドされたサービスは、常にそのための優れたアプローチです。ローマンが指摘しているように、いくつかのリクエストをキューに入れ、それらを個別に呼び出すことは強く推奨されないことに注意してください (データを使用する場合、無線接続に多くの作業を与える可能性が非常に高く、これはとりわけバッテリーを消耗させます。ここでは必須です-それについて読んでください)

個人的には、リクエストのキューと利用可能なスレッドのプールを備えたバインドされたサービスを使用することをお勧めします (そのアプローチにより、あなたの場合のように、より複雑なネットワーク操作を完全に制御できます)。ここにアプローチの詳細があり、ここにテストケースの実例があります

進捗状況をお知らせください。

于 2012-08-18T10:16:28.690 に答える
0

あなたは正しい方向に進んでいます。少しだけお手伝いさせてください。

再利用は確かに良い考えであり、Androidがあなたのためにそれをしたのであなたはそれについて心配する必要はありません(または実際にはJava;)

これはThreadPoolExecuterと呼ばれ、必要な数のタスクを開始でき、事前定義された数のスレッドのみを開きます(ベストプラクティスは、デバイスで並列ネットワーク接続を実行できる限り多くのスレッドを開くことです。私の調査によると、 4〜9)。

また、同じURLを2回ダウンロードしようとしている場合は、自分自身を保護し、1つのタスクのみを開くことができます。

于 2012-08-20T06:57:43.990 に答える