AndroidのAsynctask
、Thread
、Service
、Loader
の違いについて少し混乱しました。
私はそれがどのように機能するかを知っています。しかし、私はまだ何をいつ使うべきかを理解していません。
私はAndroidで3年間働きますが、通常はすべてのバックグラウンドタスク(およびスレッド)でAsyncTask
を使用します。)また、ロボスパイスやボレーを使用することをお勧めします。
だから、AsyncTask
は本当にひどいので、ネットワークタスクにフレームワークを使うべきですか?バックグラウンド(ネットワークではない)タスクには何を使用すればよいですか?
AysncTasksはincompleteほど「時代遅れ」ではありません。とりわけ、親タスクが現在実行されているかどうかにかかわらず、非同期タスクは気にしません。コンテキストがnullかどうかを確認するためのチェックを含めるのと同じ理由で。また、独自のThread Pool Executorを使用していない限り、これらのタスクは連続して実行されます。
Volleyは、主にメインスレッドとの同期とスレッドプーリングに関するギャップを埋めようとします。平均的なネットワーク要求を必要とするものを実行したい場合に最適に動作します。いくつかのメタデータリストや画像のように(YouTubeアプリのリクエストとFacebookアプリの投稿のリクエストを写真に収めてください)。
通常、ボレーの利点は次のとおりです。
Google I/Oで言及されているように、リクエスト/ビデオのストリーミングに関しては、Volleyの運は悪くなります。
私はロボスパイスを正確には知りません。追伸:手元に時間があれば https://www.youtube.com/watch?v=yhv8l9F44qo
同じベンチマークを使用して他のライブラリにアクセスする場合の詳細については、こちらをご覧ください。 Androidネットワークライブラリ:OkHTTP、Retrofit、およびVolley)の比較
スレッド:Javaスレッドと同じ、重い操作を行うために使用しますが、自分で管理する必要があり、同期の問題を引き起こす可能性があります。 UIスレッドで実行します。
AsyncTask:Androidバックグラウンドタスクを行うためのすばらしいスレッドライブラリ。これは、Android OS自体によって管理されます。UIを更新できます。 Androidのバージョンに応じて並列またはシリアルで実行されます。向きの変更の場合のように使用するのは面倒な場合があり、ネットワーク呼び出しを行うためにAsyncTask
よりも優れたvolleyを使用できます。親アクティビティが実行されているかどうかを気にせず、それを時々キャンセルするのは非常に退屈です。したがって、AsyncTaskを使用してREST API呼び出しをより適切に使用する場合は、 [〜#〜] retrofit [ 〜#〜] または [〜#〜] volley [〜#〜] そして、2つの間でRETROFITを選択した場合、 [〜# 〜] picasso [〜#〜] 画像読み込み用の広場からの別の素晴らしいライブラリ。
サービス:長期のバックグラウンドタスクを実行するには、サービスを使用する必要があります。必要に応じて、サービスをアクティビティにバインドできます。それらが同じスレッドまたは異なるスレッドで実行されることを定義でき、マニフェストで宣言する必要があるか、IntentService
-独自のスレッドで実行されるサービスのバリアントですが、使用する前に注意してください。長時間実行されるタスクには使用しないでください。これは単一時間の演算子です。サービスを使用する場合は、通常のサービスまたはIntentServiceよりも要件に適しているケースを評価してください
ローダー:これは多くの点でAsyncTask
と同じです。フラグメントでローダーを使用することをお勧めします。また、非同期タスクの方向の問題を解決します。
すでにkotlinに移行している場合は、 Coroutines をご覧になることをお勧めします。これらは非常に軽量であり、スレッド化に非常に効果的であり、ライフサイクルを大幅に制御できます。これがお役に立てば幸いです。
実際に使用する抽象化は重要ではありません。つまり、Thread
に要約されます。そのため、Androidの各非同期/並列クラスは、舞台裏でThread
/Executor
を使用しており、ロックなど、スレッドが持っている問題とまったく同じ潜在的な問題を抱えています。
その違いは、その使用法にあります。 AsyncTask
は、たとえば、便利な完了コールバック-onPostExecute()
を定義します。 CountDownTimer
を使用すると、時間などを制御できます。
もちろん、単純なThread
を使用することもできますが、この場合は、考えられる問題を自分でキャッチするためにより多くの時間を費やす必要があります。
したがって、Androidは、適切なジョブに適したツールをいくつか提供します。
AsyncTask
は、メインスレッドでコールバックを提供するため、Thread
よりも優れていると思います。 Loader
は、設定の変更も処理するため、AsyncTask
よりも優れています。
AsyncTaskを使用すると、UIスレッドを適切かつ簡単に使用できます。このクラスを使用すると、スレッドやハンドラーを操作することなく、バックグラウンド操作を実行し、UIスレッドで結果を公開できます。
AsyncTask
は、スレッドとハンドラーのヘルパークラスになるように設計されており、一般的なスレッドフレームワークを構成していません。 AsyncTasks
は、理想的には短い操作に使用する必要があります(最大で数秒 )
スレッドを長時間実行し続ける必要がある場合は、Executor
、ThreadPoolExecutor
、FutureTask
などのJava.util.concurrent
パッケージで提供されるさまざまなAPIを使用することを強くお勧めします。
スレッド :
メインスレッドから多数のまたは長いタスクを移動して、スムーズなレンダリングやユーザー入力への高速応答を妨げないようにすることが、アプリでスレッド化を採用する最大の理由です。
これを使用して、実行時間の長い計算をメインスレッド(UIスレッド)から分離します。
サービス :
サービスは、バックグラウンドで長時間実行される操作を実行できるアプリケーションコンポーネントであり、ユーザーインターフェイスを提供しません。
サービスは、ネットワークトランザクションの処理、音楽の再生、ファイルI/Oの実行、またはコンテンツプロバイダーとのやり取りを行うことができます、すべてバックグラウンドから。
IntentServiceは、要求に応じて非同期要求(Intentとして表される)を処理するサービスの基本クラスです。
すべてのリクエストは単一のワーカースレッドで処理されます-必要なだけ時間がかかります(アプリケーションのメインループはブロックされません)、一度に処理される
ローダー :
Loader APIを使用すると、コンテンツプロバイダーまたはその他のデータソースからデータをロードして、アクティビティまたはフラグメントに表示できます。
ローダーはこれらの問題を解決し、他の利点を含みます。例えば:
ローダーは別々のスレッドで実行され、ジャンキーなUIや応答しないUIを防ぎます。
ローダーは、イベントが発生したときにコールバックメソッドを提供することにより、スレッド管理を簡素化します。
だから、Asynctaskは本当に悪いのですか?ネットワークタスクにはフレームワークを使用する必要がありますか?そして、(ネットワークではなく)バックグラウンドタスクに何を使うべきですか?
AsyncTask
を使用して、期間が5ミリ秒より短い作業項目を処理します。バックグラウンドタスクには、Thread
またはService
またはIntentService
のいずれかを使用できます。