web-dev-qa-db-ja.com

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

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

ThreadAsyncTaskの主な違いは何ですか?

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

123
Ram

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

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

:にAsyncTaskを使用します:

  1. 大量のデータをダウンロードする必要のない単純なネットワーク操作
  2. 数ミリ秒以上かかるディスクバウンドタスク

Javaスレッドを使用して:

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

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

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

136
Mohit

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

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

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

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

Androidの構成変更を処理するためのデフォルトはありません

39
Tarun Varshney

スレッド

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

AsyncTask

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

スレッド

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

1つは、Threadを拡張する新しいクラスを提供し、run()メソッドをオーバーライドすることです。もう1つは、作成中にRunnableオブジェクトを持つ新しいThreadインスタンスを提供しています。スレッドは、その「start」メソッドを呼び出すことで実行できます。スレッドの「優先度」を設定するには、その「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スレッドである場合に使用します)。

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

詳細については、 こちら をご覧ください。

11
Vipul Purohit

スレッド:

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

AsyncTaskを使用して、期間が5ミリ秒より短い作業項目を処理できます。 AsyncTaskを使用すると、Java Threadとは異なりUIを更新できます。ただし、長時間実行されるタスクの多くはパフォーマンスを抑制します。

両方に代わる選択肢はほとんどありません。

HandlerThread / Handler および ThreadPoolExecutor

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

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

2
Ravindra babu