6

私のアプリでは、重い作業を行うメソッドを呼び出す必要があります (デバイスの遅延を感じることがあります)。これを避けるために、私は を作成しましたがAsyncTask、それは完全に正常に動作します。

ここでもa を使用して同じことを実装しましたThreadが、問題は発生せず、正常に動作します。

さて、私の質問は、どちらがパフォーマンス的に優れているかです- AsyncTaskまたはThread.

スレッドプールを使用してバックグラウンド タスクを実行することは知っAsyncTaskていますが、私の場合は 1 回だけ呼び出されます。したがって、問題が発生することはないと思います。

誰かがそれに光を当てることができますか?パフォーマンスを向上させるには、どちらを使用する必要がありますか?

注: 両方とも私のアクティビティで呼び出されています (例: UI スレッドから)。

4

3 に答える 3

6

誰かがそれに光を当てることができますか?パフォーマンスを向上させるには、どちらを使用する必要がありますか?

ネイティブ Thread と AsyncTask を一度起動する場合を想像すれば、パフォーマンスは変わらないと思います。

USERを介して、あるタスクの進行状況に関する関連情報をポテンシャルに通知したくない場合は、通常、ネイティブ スレッドが使用されますUI。ここでは、ネイティブ スレッドがスレッドと同期されておらず、ネイティブ スレッドUIから UI 操作を実行できないため、失敗します。

一方、AsyncTask はバックグラウンド作業と UI 作業を組み合わせ、UI と同期するメソッドを提供し、ライフサイクルの適切なメソッドを呼び出すことでいつでも UI の更新を実行できるようにします。

通常、タスクが 5 秒以上続く場合は、次のことを通知する必要がありますUSER

「バックグラウンドで何か作業中です。完了するまでお待ちください」

確かに、これはさまざまな方法で両方で到達できますが、これはタスクの特性に大きく依存します-タスクの進行状況を表示する必要がある場合(既にダウンロードされているMBの量、ファイルの数をコピーし、進行中の各ダイアログの名前を表示します)など)またはそうしません(たとえば、開始メッセージと終了メッセージのみを使用して「サイレント」で大きなデータ構造を作成します)。

だから、私の回答の最後に:

パフォーマンスを向上させるには、どちらを使用する必要がありますか?

開発者ごとに経験やコーディング スタイルが異なるため、完全に正しい答えは得られないと思います。私が言ったように、それらのパフォーマンスは変わりません。私は同じだと思います(50MBのファイルを読むなら、ネイティブスレッドもAsyncTaskも速く読むことはありません)。それはまた、仕事の性質とあなたの個人的な選択に依存します.

アップデート:

はるかに長い期間続く可能性のあるタスクの場合、パッケージAPIによって提供されるツールjava.util.concurrent(ThreadPoolExecutor、FutureTask など)についても考えてみることができます。

于 2013-04-01T14:58:05.223 に答える
2

非同期タスクもスレッドです。ただし、小さなバックグラウンド タスクを実行し、UI に戻って変更を加えるのを非常に簡単にするいくつかのユーティリティ メソッドがあります。パフォーマンスは、特定のユース ケースによって異なります。どちらが常に優れているかについて絶対的な声明を出すことは、単純すぎて無意味です。

スレッドに対する非同期タスクの主な利点は、非同期タスクがonPreExecute()doInBackground()onProgressUpdate()などのヘルパー メソッドを提供することですonPostExecute()。これにより、UI と対話しながら短いバックグラウンド タスクを非常に簡単に実行できます (プログレス バーの更新など)。これらの種類のメソッドは、ジェネリック スレッドでは使用できません。基本的に、非同期タスクは UI 対話コンポーネントが組み込まれたスレッドです。はい、回避策を使用して、通常のスレッドから UI を試して更新することもできますが、非同期タスクはこの目的のために特別に構築されており、Context を処理する必要はありません。抽象化に従うと、リークなどが発生します。

非同期タスクは、開発者の生活を楽にするために作成されます。

総括する:

  • 非同期タスクもスレッドです
  • 非同期タスクにより、短いバックグラウンド タスクを実行しながら UI を簡単に操作できます
  • どちらも本質的により効率的ではありません。それはあなたが何をしたいかによります。
  • 経験則: バックグラウンド タスクの完了後に UI に戻る/更新する必要がある場合は、非同期タスクを使用します。そうでない場合は、通常のスレッドを使用してください。
于 2013-04-01T14:25:05.013 に答える