Androidの非同期タスクとスレッド


135

UIでは、いくつかのバックグラウンド作業を実行するために、別のを使用しましたThread。しかし、他の人が示唆したように、私は現在を使用していAsyncTaskます。

a Threadとanの主な違いは何AsyncTaskですか?

どのシナリオで、a ThreadまたはAsyncTask?を使用する必要がありますか?



@ webaldo.atこれを参照しました。ここで、AsynctaskとThreadの説明と違いを入力しました。たとえば、ネットワーク接続の例を知りたいのですが、使用するファイルを読み取ります。
Ram

短縮:スレッド-> UIスレッドへのアクセスなし|| Asynctask-> UIスレッドへの条件付きアクセス
JavaDM 2013

バックグラウンドタスクの場合は、IntentServiceも便利なオプションです。
Chen

回答:


146

実行時間の長いタスクやCPUを集中的に使用するタスクの場合、これを行うには基本的に2つの方法があります。JavaスレッドとAndroidのネイティブAsyncTaskです。

どちらかが必ずしも他より優れているわけではありませんが、システムのパフォーマンスを最大限に活用するには、各呼び出しをいつ使用するかを知ることが不可欠です。

AsyncTaskを使用して:

  1. 大量のデータをダウンロードする必要がないシンプルなネットワーク操作
  2. 数ミリ秒以上かかる可能性のあるディスクにバインドされたタスク

以下のためにJavaスレッドを使用します。

  1. 中程度から大量のデータ(アップロードまたはダウンロード)を伴うネットワーク操作
  2. バックグラウンドで実行する必要があるハイCPUタスク
  3. GUIスレッドに関連してCPU使用率を制御したいタスク

そして、あなたを助けるかもしれないインターネット上の良いリソースがたくさんあります:

http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html


ダウンロードデータ量に問題があるのはなぜですか?
Yeung

1
@Yeung非同期タスクについての洞察が必要なようです!データ量が多いほど、同じ操作を完了するのにかかる時間が明らかに長くなります。したがって、次の理由により、非同期タスクを使用して長時間実行するプロセスを実行することはお勧めできません。2.それらは、メモリリークを作成します。
Mohit


ありがとうございました。私は今リスクを理解しています。
Yeung

@Impasse @Yeung IMOデータ量は問題ではありません。操作時のネットワーク操作の主要な問題です。数バイトのダウンロードでさえ、サーバーがビジーである、到達できない(タイムアウト)などの場合、長い時間がかかる可能性があります。修正はAsyncTask、独自のスケジューラで使用することです。
xmedeko 2016年

44

Javaスレッドを使用する場合は、独自のコードで次の要件を処理する必要があります。

結果をユーザーインターフェイスにポストバックした場合のメインスレッドとの同期

スレッドをキャンセルするためのデフォルトはありません

デフォルトのスレッドプーリングなし

Androidの構成変更を処理するためのデフォルトなし


3
これは、単純なスレッドを使用しない理由に取り組むため、実際にはより明確になります。タスクの内部でリソースを手動で「適切にデグレード」する必要がある場合でも、アクティビティ/サービスのライフサイクルに関連付ける必要があるものはすべて、少なくともタスクがハングすることはありません。アクティビティが終了したとき。
leRobot、2015

28

  • 一般的に 長いタスク
  • thread.start()メソッドで呼び出す
  • 任意のスレッドからトリガーされます
  • 独自のスレッドで実行されます
  • 手動のスレッド管理/コードが読みにくくなる場合がある

AsyncTask

  • メインスレッドと通信する必要がある小さなタスク
  • excute()メソッドで呼び出す
  • メインスレッドからトリガー
  • ワーカースレッドで実行
  • メインスレッドから実行および作成する必要があります

11

スレッドは、同時実行単位です。独自の呼び出しスタックがあります。アプリケーションにスレッドを実装するには、2つの方法があります。

1つは、Threadを拡張する新しいクラスを提供し、run()メソッドをオーバーライドすることです。もう1つは、作成中にRunnableオブジェクトを持つ新しいThreadインスタンスを提供することです。スレッドは、その「開始」メソッドを呼び出すことによって実行できます。「setPriority(int)」メソッドを呼び出すことにより、スレッドの「優先度」を設定できます。

UI部分に影響がない場合は、スレッドを使用できます。たとえば、一部のWebサービスを呼び出したり、一部のデータをダウンロードしたりして、ダウンロード後に画面に表示します。次に、ハンドラをスレッドで使用する必要があります。これにより、アプリケーションがスレッドからのすべての応答を処理するのが複雑になります。

ハンドラーを使用すると、スレッドのMessageQueueに関連付けられたMessageオブジェクトとRunnableオブジェクトを送信して処理できます。各スレッドには各メッセージキューがあります。(To Doリストのように)、スレッドは各メッセージを受け取り、メッセージキューが空になるまでそれを処理します。したがって、ハンドラーが通信すると、ハンドラーは呼び出し側スレッドにメッセージを送信するだけで、処理を待機します。

Javaスレッドを使用する場合は、独自のコードで次の要件を処理する必要があります。

結果をユーザーインターフェイスにポストバックした場合のメインスレッドとの同期スレッドをキャンセルするためのデフォルトなしデフォルトのスレッドプーリングなしAndroidで構成変更を処理するためのデフォルトなし

AsyncTask

AsyncTaskを使用すると、UIスレッドを適切かつ簡単に使用できます。このクラスを使用すると、スレッドやハンドラーを操作しなくても、UIスレッドでバックグラウンド操作を実行して結果を公開できます。非同期タスクは、バックグラウンドスレッドで実行され、その結果がUIスレッドで公開される計算によって定義されます。

AsyncTaskは、次の4つの段階を経ます。

onPreExecute()

タスクが実行される前にUIスレッドで呼び出されます

doInbackground(Params ..)

onPreExecute()の実行が終了した直後にバックグラウンドスレッドで呼び出されます。

onProgressUpdate(Progress ..)

publishProgress(Progress ...)の呼び出し後にUIスレッドで呼び出されます。

onPostExecute(Result)

バックグラウンド計算が終了した後、UIスレッドで呼び出されます。

なぜAsyncTaskを使用する必要があるのですか?

UIスレッドで使いやすい。(したがって、呼び出し側スレッドがUIスレッドの場合に使用します)。

ハンドラーを操作する必要はありません。

さらに情報をご覧ください。ここ


2

糸:

Threadパフォーマンスが向上するように、メインスレッドから実行時間の長い操作を分離するために使用する必要があります。しかし、エレガントにキャンセルすることはできず、Androidの構成変更を処理することもできません。からUIを更新することはできませんThread

AsyncTask持続時間が5ミリ秒未満の作業項目を処理するために使用できます。ではAsyncTask、javaとは異なりUIを更新できますThread。ただし、長時間実行される多くのタスクはパフォーマンスを低下させます。

あなたはそれらの両方にいくつかのより多くの選択肢があります。

HandlerThread / HandlerおよびThreadPoolExecutor

詳細については、以下の投稿を参照してください。

ハンドラーvs AsyncTask vsスレッド

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.