2012-05-02 10 views
4

AsyncTaskは1つのジョブしか実行できないのはなぜですか?例えば、AndroidのハンドラとAsyncTaskの違いの1つ

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

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

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

は一回のジョブのAasyncTaskオブジェクトですが?同じようなタスクのために複数のオブジェクトを作成したくない場合は、Handlerを選択する必要がありますか?

答えて

5

ハンドラとAsyncTasksは、UI/Event Threadでマルチスレッドを実装する方法です。

ハンドラでは、スレッドを作成するスレッドにメッセージを追加することができます。また、今後いくつかの実行時に実行するようにスケジュールすることもできます。

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

したがって、AsyncTask複数のTImesでexecuteメソッドを呼び出す必要はありません。代わりにpublishProgressを呼び出すことができます。

0

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

関連する問題