153

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

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

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

4

5 に答える 5

161

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

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

次の目的で AsyncTask を使用します。

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

次の目的で Java スレッドを使用します。

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

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

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

于 2013-08-28T05:51:28.670 に答える
48

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

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

スレッドをキャンセルするためのデフォルトなし

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

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

于 2013-08-28T06:03:16.350 に答える
34

スレッド

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

非同期タスク

  • メインスレッドと通信する小さなタスク
  • execute() メソッドによる呼び出し
  • メインスレッドからトリガー
  • ワーカー スレッドで実行
  • メインスレッドから実行および作成する必要があります
于 2014-05-19T04:40:41.327 に答える
14

スレッド

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

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

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

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

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

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

非同期タスク

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

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

onPreExecute()

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

doInbackground(Params..)

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

onProgressUpdate(進行状況..)

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

onPostExecute(結果)

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

AsyncTask を使用する理由

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

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

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

于 2013-08-28T05:54:18.607 に答える