2013-07-04 41 views
52

私は困惑しています。AsyncTaskとThread/Runnableの違い

私は別のスレッドで、SDKドキュメントで推奨されているように、バックグラウンドスレッドを使用する必要があるGPS /ロケーションの取得など、何かしたいとします。だからここ

は質問です:AsyncTask

  • Thread thread1 = new Thread(new Runnable()の作成...とrun()を実装経由

    バックグラウンドでThreadを作成
    1. の違いは何ですか?

  • 答えて

    40

    AsyncTaskは新しいスレッドでいくつかの作業を行うための便利なクラスで、終わったときに、それが呼ばれました、そこから糸(通常はUIスレッド)の結果を使用しています。それは、いくつかのランナブルを使用するが、スレッドの作成とスレッド間のメッセージングの処理のすべての複雑さを処理する単なるラッパーです。

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

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

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

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

    私はthis blogから引用場合:

    あなたはSIMPLEコーディング使用AsyncTaskが必要な場合、あなたはSPEEDは、従来のJavaスレッドを使用する必要がある場合。

    +0

    をけれどもノートを行い、あなたのコードを動作させているアンドロイドのバージョンに応じて、一つだけAsyncTaskが一度に実行されているがあり得ること。 –

    +1

    @AlexGittemeierこれらのバージョンでさえ、executeOnExecutorを使用し、executeを呼び出すのではなく、プールを使用するように指示することで、それ以上のバージョンを実行するように指示できます。 –

    +1

    AsyncTask:プロセス完了後の応答、スレッド:プロセス完了。 –

    1

    また、Android v4.04からは、下位バージョンとの互換性を失うことがない限り、一度に複数のAsyncTasksを設定することはできません。気をつけてください!

    +5

    あなたが 'executeOnExecutor()'を使うとできます条件付きで行うことができるため、互換性を失うことはありません)。 – matiash

    0

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

    1

    主な違い:

    1. AsyncTask非同期タスクは、その結果、UIスレッド上で公開されているバックグラウンドスレッドで実行される演算で定義されています。 UIスレッドでHandlerを使用してメッセージを投稿しない限り、または適切な同期を実装してオブジェクトの属性を直接変更しない限り、通常のスレッドでは実行できません。 Thread performanceに関する開発者向けガイドで推奨されているように

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

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

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

    ルーパを持つ新しいスレッドを開始するためのHandyクラス。ルーパーを使用してハンドラクラスを作成することができます。 start()は依然として呼び出されなければならないことに注意してください。

    詳細を知るために、ポストの下を参照してください。

    Handler vs AsyncTask vs Thread

    関連する問題