web-dev-qa-db-ja.com

AsyncTaskとThread / Runnableの違い

困惑する質問があります。

SDKドキュメントで推奨されているように、バックグラウンドスレッドを使用する必要があるGPS/Locationのものを取得するなど、別のスレッドで何かをしたいと想像してください。

ここに質問があります:違いは何ですか

  1. Thread経由でバックグラウンドでAsyncTaskを作成[〜#〜] and [〜#〜]

  2. Thread thread1 = new Thread(new Runnable()を作成し、run()?を実装していますか?

57
kevoroid

AsyncTask は、新しいスレッドで何らかの作業を行い、終了時に呼び出し元のスレッド(通常はUIスレッド)で結果を使用するための便利なクラスです。いくつかの実行可能ファイルを使用する単なるラッパーですが、スレッドの作成とスレッド間のメッセージングの処理のすべての複雑さを処理します。

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

AsyncTaskは、スレッドとハンドラーのヘルパークラスになるように設計されており、汎用のスレッドフレームワークを構成していません。 AsyncTasksは、短い操作(最大で数秒)に使用するのが理想的です。スレッドを長時間実行し続ける必要がある場合は、Java.util.concurrent pacakgeが提供するさまざまなAPIを使用することを強くお勧めします。エグゼキューター、ThreadPoolExecutor、およびFutureTask。

非同期タスクは、バックグラウンドスレッドで実行され、その結果がUIスレッドで公開される計算によって定義されます。非同期タスクは、Params、ProgressおよびResultと呼ばれる3つのジェネリックタイプと、onPreExecute、doInBackground、onProgressUpdateおよびonPostExecuteと呼ばれる4つのステップで定義されます。

Runnable インターフェースはJava threading。のコアです。Runnableインターフェースは、スレッドによって実行されることを意図したインスタンスを持つクラスによって実装される必要があります。

このブログ から引用した場合:

sIMPLEコーディングが必要な場合はAsyncTaskを使用し、SPEEDが必要な場合は従来のJava Thread。

45
NINCOMPOOP

また、Android v4.04から開始し、下位バージョンとの互換性を失わない限り、一度に複数のAsyncTasksを持つことはできません。

2
Lorenzo

主な違い:

  1. AsyncTask は、バックグラウンドスレッドで実行され、その結果がUIスレッドで公開される計算によって定義される非同期タスクです。 UIスレッドでHandlerを使用し、適切な同期を実装してオブジェクトの属性を直接変更するORを使用しない限り、通常のスレッドでは実行できません。

  2. スレッドパフォーマンス に関する開発者ガイドの推奨どおり、

    留意すべきパフォーマンスの重要な側面がいくつかあります。まず、デフォルトでは、アプリは作成するすべてのAsyncTaskオブジェクトを単一のスレッドにプッシュします。したがって、それらはシリアル方式で実行され、メインスレッドと同様に、特に長い作業パケットがキューをブロックする可能性があります。このため、AsyncTaskを使用して、期間が5ミリ秒より短い作業項目を処理することをお勧めします。

    ただし、通常の Thread は、長時間実行されるタスクに使用できます。

プレーンJavaスレッドは、Androidフレームワークで提供されている HandlerThread とは異なり、Androidにはあまり役立ちません。

ルーパーを持つ新しいスレッドを開始するための便利なクラス。その後、ルーパーを使用してハンドラークラスを作成できます。 start()を呼び出す必要があることに注意してください。

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

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

2
Ravindra babu

サポートライブラリで新しいジョブスケジューラを使用することをお勧めします。

0
user10754009

AsyncTaskクラスの明らかな欠点の1つは、Android 3.0以降、開始時刻のシーケンスに従ってasynctasksが実行されることです。つまり、 'executeOnExecutorを呼び出してタスクを実行しない限り、 (Executors.newCachedThreadPool()) '。このメソッドは独自のスレッドプールを作成します。

0
Stevens