2012-02-16 1 views
12

私はFragmentsとLoaderManagerを使用しています。私は未知数のタスクを起動しなければならず、それらは並列で実行されるかもしれません(さもなければ、ただ1つのローダーしか再利用しません)。たとえば、私はリストビューを持っており、各行にはその行の内容をWebサーバーに保存するボタンがあります。ユーザーは、複数のアイテムに対して並行して保存要求を開始できます。LoaderManagerを使用した複数のローダーのパターン?

private int nextId = 0; 

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

それはすでにAPIで実装何かあるかもしれないように私は自分自身簿記しようと、手動でローダのプールを作成し、可能な場合は、それらを再利用することができ、そうですか?

おかげ

+1

良い質問。あなたはそれを解決することができましたか?私はあなたが何とかあなたの仕事を待つべきだと思います。 –

答えて

4

私は、リモートサーバーにデータを保存するためのローダを使用する必要があるとは思いません。

代わりに、IntentServiceなどの「保存」操作のキューを処理するのに似たものを使用してください。この方法で、Webサーバーとの通信を一括して行うことができます。つまり、1つのアイテムの複数のキュー保存を1つの操作にまとめることができ、必要に応じてアクティビティの存続期間を超えて存続します。

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

+0

そして、データベースに 'n'というカテゴリがあり、' CursorLoader'を使ってそれらをロードしたいのですが?私はどんなIDを使うべきですか? – pixel

+1

あなたは確かに任意のIDを使用することができ、カテゴリが静的であればおそらく整数1..nになります。最初にカテゴリのリストをロードしてから各カテゴリの詳細をロードする場合は、おそらくクエリを最適化する必要があります。しかし、あなたが他のオプションを持っていないと仮定すると、ローダーIDとして安定したIDを使うべきです。カーソル位置。 –

1

IntentServiceまたはバインドされたサービスは、常にそのための良いアプローチです。 ローマンポイントとして、いくつかの要求をキューに入れて別々に呼び出すことは強くお勧めできません(データを使用するときは、無線接続に多くの仕事を与える可能性が非常に高いです。そのことについて)

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

あなたの進捗状況についてお問い合わせください。

0

あなたは正しい方向に向いています。ちょっとお手伝いしましょう。 (実際またはJava;)

の再利用は確かに良いアイデアです、そしてあなたはAndroidがあなたのためにそれをやったので、それを心配する必要はありませんあなたが望むようにあなたに多くのタスクを開始することができ、それは、ThreadPoolExecuterと呼ば

と彼はあらかじめ定義された数のスレッドを開くだけです(ベストプラクティスは並列ネットワーク接続がデバイス上で実行できるように多くのスレッドをオープンしようとしています。

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

関連する問題