3

AsyncSyncがActivityまたはIntentServiceから起動されることに違いはありますか?

http経由でファイルをダウンロードおよびアップロードするアプリを作成しています。転送ごとにプログレスバー付きのカスタム通知レイアウトを使用します。転送を並行して実行するか、キューに入れるかを選択します(どちらのオプションをお勧めしますか?)。

キューのあるオプションでは、IntentServiceを使用しているため、Androidフレームワークがタスクをキューに入れてくれます。それらを並列にするために、私はAsyncTasksを使用します。しかし、私はそれらをIntentServiceから起動します(Serviceの場合もあります)-そうする意味はありますか?IntentServiceは、AsyncTaskを実行した直後に終了するため、AsyncTaskは「親」なしで実行されます。

アクティビティからこれらのAsyncTaskを起動した場合、ホーム画面に移動し、システムがこのアクティビティを閉じることを決定した場合はどうなりますか?それはできますか?AsyncTaskはそれを乗り切りますか?

この場合の好ましいアプローチは何でしょうか?

4

2 に答える 2

1

AsyncTaskは、コンポーネントのライフサイクルの外で存続することを懸念している場合(そのコンポーネントにメッセージを返す必要がある場合)には実際には適切ではありません。あなたがサービスを持っている程度に行くのであれば、私はAsyncTasksを気にすることさえしません。並列またはキューに関しては、それは実際には多くの異なる変数に依存しますが、ダウンロード/アップロードの数に関係なく、完全に並列にすることはできません。同時転送の最大数に制限を設定します。

並列実行にIntentServiceを使用しても意味がありません。これには、すでに問題があることに気づいています。AndroidAPIで実際にはカバーされていない領域に入っています。AsyncTaskとIntentServiceは、いくつかのシナリオを簡単にする優れた抽象化ですが、多くの多くのタスクの並列実行はそれらの1つではありません。おそらく、Javaスレッド/並行性クラスのいくつかを使用するのが最善です。ThreadPoolExecutorを見てください。

于 2011-07-29T17:47:34.223 に答える
0

最初に簡単な質問ですが、親アプリケーションが強制終了されない限り、AsyncTaskはバックグラウンドで存続します。アクティビティから開始すると、メモリの負荷が必要な場合に強制終了できることがシステムに通知されます。また、システムは、中断される可能性のある長時間実行プロセスがあるとは見なしません。

開発ガイドサービスの「基本」の見出しの下に、サービスとアクティビティのどちらを使用するかについての優れた情報ボックスがあります。アクティビティは、システムリソースが再び利用可能になったときに、サービスが取得するメモリプレッシャーの考慮事項や、強制終了後に再起動することはありません。

電話をかけてほしい場合は、IntentServiceを使用してください。ネットワーク(WifiまたはCellular)、ファイルサイズ、およびその他のシステムリソースを考慮する必要があるため、ダウンロードを並行して実行するか、直列に実行するか、またはいくつかの組み合わせで実行するかは難しい問題です。

于 2011-07-29T17:47:12.543 に答える