web-dev-qa-db-ja.com

非同期タスク対スレッド対サービス対ローダー

AndroidのAsynctaskThreadServiceLoaderの違いについて少し混乱しました。

私はそれがどのように機能するかを知っています。しかし、私はまだ何をいつ使うべきかを理解していません。

私はAndroidで3年間働きますが、通常はすべてのバックグラウンドタスク(およびスレッド)でAsyncTaskを使用します。)また、ロボスパイスやボレーを使用することをお勧めします。

だから、AsyncTaskは本当にひどいので、ネットワークタスクにフレームワークを使うべきですか?バックグラウンド(ネットワークではない)タスクには何を使用すればよいですか?

31
Suvitruf

AysncTasksはincompleteほど「時代遅れ」ではありません。とりわけ、親タスクが現在実行されているかどうかにかかわらず、非同期タスクは気にしません。コンテキストがnullかどうかを確認するためのチェックを含めるのと同じ理由で。また、独自のThread Pool Executorを使用していない限り、これらのタスクは連続して実行されます。

Volleyは、主にメインスレッドとの同期とスレッドプーリングに関するギャップを埋めようとします。平均的なネットワーク要求を必要とするものを実行したい場合に最適に動作します。いくつかのメタデータリストや画像のように(YouTubeアプリのリクエストとFacebookアプリの投稿のリクエストを写真に収めてください)。

通常、ボレーの利点は次のとおりです。

  1. ワーカースレッドにアクティビティに関する情報を保持します(メインスレッド)
  2. より簡単なリソースの優先順位付けにより、ダウンロード要求に優先順位を付けることができます。典型的なシナリオでは、画像よりもテキストを優先します。
  3. 効果的な要求キャッシュとメモリ管理。
  4. 拡張可能
  5. アクティビティがシャットダウンまたは再起動された場合に、リクエストを破棄するオプションを提供します。
  6. AsyncTasksとは対照的に、データ取得のより単純なパターン。

Google I/Oで言及されているように、リクエスト/ビデオのストリーミングに関しては、Volleyの運は悪くなります。

私はロボスパイスを正確には知りません。追伸:手元に時間があれば https://www.youtube.com/watch?v=yhv8l9F44qo

同じベンチマークを使用して他のライブラリにアクセスする場合の詳細については、こちらをご覧ください。 Androidネットワークライブラリ:OkHTTP、Retrofit、およびVolley)の比較

19
humblerookie

スレッド:Javaスレッドと同じ、重い操作を行うために使用しますが、自分で管理する必要があり、同期の問題を引き起こす可能性があります。 UIスレッドで実行します。

AsyncTask:Androidバックグラウンドタスクを行うためのすばらしいスレッドライブラリ。これは、Android OS自体によって管理されます。UIを更新できます。 Androidのバージョンに応じて並列またはシリアルで実行されます。向きの変更の場合のように使用するのは面倒な場合があり、ネットワーク呼び出しを行うためにAsyncTaskよりも優れたvolleyを使用できます。親アクティビティが実行されているかどうかを気にせず、それを時々キャンセルするのは非常に退屈です。したがって、AsyncTaskを使用してREST API呼び出しをより適切に使用する場合は、 [〜#〜] retrofit [ 〜#〜] または [〜#〜] volley [〜#〜] そして、2つの間でRETROFITを選択した場合、 [〜# 〜] picasso [〜#〜] 画像読み込み用の広場からの別の素晴らしいライブラリ。

サービス:長期のバックグラウンドタスクを実行するには、サービスを使用する必要があります。必要に応じて、サービスをアクティビティにバインドできます。それらが同じスレッドまたは異なるスレッドで実行されることを定義でき、マニフェストで宣言する必要があるか、IntentService-独自のスレッドで実行されるサービスのバリアントですが、使用する前に注意してください。長時間実行されるタスクには使用しないでください。これは単一時間の演算子です。サービスを使用する場合は、通常のサービスまたはIntentServiceよりも要件に適しているケースを評価してください

ローダー:これは多くの点でAsyncTaskと同じです。フラグメントでローダーを使用することをお勧めします。また、非同期タスクの方向の問題を解決します。

すでにkotlinに移行している場合は、 Coroutines をご覧になることをお勧めします。これらは非常に軽量であり、スレッド化に非常に効果的であり、ライフサイクルを大幅に制御できます。これがお役に立てば幸いです。

25
Pramod Yadav

実際に使用する抽象化は重要ではありません。つまり、Threadに要約されます。そのため、Androidの各非同期/並列クラスは、舞台裏でThread/Executorを使用しており、ロックなど、スレッドが持っている問題とまったく同じ潜在的な問題を抱えています。

その違いは、その使用法にあります。 AsyncTaskは、たとえば、便利な完了コールバック-onPostExecute()を定義します。 CountDownTimerを使用すると、時間などを制御できます。

もちろん、単純なThreadを使用することもできますが、この場合は、考えられる問題を自分でキャッチするためにより多くの時間を費やす必要があります。

したがって、Androidは、適切なジョブに適したツールをいくつか提供します。

4
injecteer

AsyncTaskは、メインスレッドでコールバックを提供するため、Threadよりも優れていると思います。 Loaderは、設定の変更も処理するため、AsyncTaskよりも優れています。

2
Fei Qu

AsyncTask

AsyncTaskを使用すると、UIスレッドを適切かつ簡単に使用できます。このクラスを使用すると、スレッドやハンドラーを操作することなく、バックグラウンド操作を実行し、UIスレッドで結果を公開できます。

AsyncTaskは、スレッドとハンドラーのヘルパークラスになるように設計されており、一般的なスレッドフレームワークを構成していません。 AsyncTasksは、理想的には短い操作に使用する必要があります(最大で数秒

スレッドを長時間実行し続ける必要がある場合は、ExecutorThreadPoolExecutorFutureTaskなどのJava.util.concurrentパッケージで提供されるさまざまなAPIを使用することを強くお勧めします。

スレッド

メインスレッドから多数のまたは長いタスクを移動して、スムーズなレンダリングやユーザー入力への高速応答を妨げないようにすることが、アプリでスレッド化を採用する最大の理由です。

これを使用して、実行時間の長い計算をメインスレッド(UIスレッド)から分離します。

サービス

サービスは、バックグラウンドで長時間実行される操作を実行できるアプリケーションコンポーネントであり、ユーザーインターフェイスを提供しません。

サービスは、ネットワークトランザクションの処理、音楽の再生、ファイルI/Oの実行、またはコンテンツプロバイダーとのやり取りを行うことができます、すべてバックグラウンドから。

IntentService

IntentServiceは、要求に応じて非同期要求(Intentとして表される)を処理するサービスの基本クラスです。

すべてのリクエストは単一のワーカースレッドで処理されます-必要なだけ時間がかかります(アプリケーションのメインループはブロックされません)、一度に処理される

ローダー

Loader APIを使用すると、コンテンツプロバイダーまたはその他のデータソースからデータをロードして、アクティビティまたはフラグメントに表示できます。

ローダーはこれらの問題を解決し、他の利点を含みます。例えば:

  1. ローダーは別々のスレッドで実行され、ジャンキーなUIや応答しないUIを防ぎます。

  2. ローダーは、イベントが発生したときにコールバックメソッドを提供することにより、スレッド管理を簡素化します。

  3. ローダーは、設定の変更全体にわたって結果を保持およびキャッシュして、クエリの重複を防ぎます。
  4. ローダーは、基礎となるデータソースの変更を監視するオブザーバーを実装できます。

だから、Asynctaskは本当に悪いのですか?ネットワークタスクにはフレームワークを使用する必要がありますか?そして、(ネットワークではなく)バックグラウンドタスクに何を使うべきですか?

AsyncTaskを使用して、期間が5ミリ秒より短い作業項目を処理します。バックグラウンドタスクには、ThreadまたはServiceまたはIntentServiceのいずれかを使用できます。

2
Ravindra babu