4

AsyncTask1 つのジョブしか実行できないのはなぜですか? 例えば、

task = new SubAsyncTask(...); // assume the parameter is correct.
task.execute(...) //
task.execute(...)// calling once again, it throws exeception.

ただし、 aHandlerは複数のタスクを継続的に実行できます。

hd = new Handler(...); // assume the parameter is correct
hd.sendMessage(...); //
hd.sendMessage(...);// no exeception is thrown.

AasyncTask1回限りの作業のみの対象ですか?同様のタスクのために複数のオブジェクトを作成したくない場合、選択する必要がありますHandlerか?

4

2 に答える 2

5

ハンドラーとAsyncTasksは、UI/イベントスレッドを使用してマルチスレッドを実装する方法です。

ハンドラーを使用すると、メッセージを作成するスレッドにメッセージを追加できます。また、将来のある時点で実行可能な実行可能ファイルをスケジュールすることもできます。

非同期タスクを使用すると、手をスレッドに汚すことなくマルチスレッドを実装できます。非同期タスクは、コードを機能させるために定義する必要のあるいくつかのメソッドを提供します。onPreExecuteでは、バックグラウンド処理を開始する前に実行する必要のあるコードを定義できます。doInBackgroundには、バックグラウンドで実行する必要のあるコードがあります。doInBackgroundでは、publishProgress()メソッドによって結果をイベントスレッドに複数回送信でき、バックグラウンド処理が完了したことを通知するために、簡単に結果を返すことができます。onProgressUpdate()メソッドは、publishProgressメソッドを介して公開されたdoInBackgroundメソッドから進行状況の更新を受け取ります。このメソッドは、この進行状況の更新を使用してイベントスレッドを更新でき、onPostExecute()メソッドはdoInBackgroundメソッドによって返された結果を処理します。

So, you dont need to call execute method on AsyncTask multiple TImes, instead you can invoke publishProgress.

于 2012-05-02T04:22:37.370 に答える
0

それがクラスの設計方法だからです。アイデアは次のとおりです。UIで何かを実行し(進行状況ダイアログを表示するなど)、バックグラウンドスレッドで作業して結果を返し、UIを更新します。これHandlerは根本的に異なります。メッセージを投稿できますが、バックグラウンドスレッドは作成されません。動作が気に入らない場合はAsyncTask、スレッド/エグゼキュータとハンドラを使用して同様のビルドを行います。

于 2012-05-02T04:05:01.800 に答える