2011-07-24 14 views
2

はブック経由でアンドロイドを学ぶのnoob午前スレッドのために、私は本の中で説明されている3つの主な方法があります参照してください。アンドロイド、スレッド - ハンドラ/ asynctask

  • ハンドラがポストを経由して、メッセージング
  • ハンドラを経由して
  • Asynctask

すべて3は良いように見える、私の質問は:
あなたが上記のいずれかを使用する特定の時間はありますか?それとも個人的な好みですか?

EDIT:
私は複数のスレッドを持つことを計画していますので、あなたが他の(でもリンクが認識されるであろう)でない場合は1

を使用する際にとしてのない個人的な好みは、私の例をお願いした場合(例えば、アプリの実行時間の合計、アプリ内の回答が選択されるまでの時間、背景画像の移動など)を選択し、どちらを選択するかを知りたい場合などです。私はこれらの3つの方法のいずれかを使用して欲しいものの機能を行うことができます。なぜなら、どちらか一方で行うことができるのはなぜ3つあるのか混乱しているからです。

ありがとうございます!

答えて

2

ハンドラは、さまざまなスレッド(通常はUIスレッド)でコードを実行できる非常に基本的な方法です。あなたのスレッドをどのように走らせるかを教えてくれるわけではなく、あなたはその点であなたが望むものを自由に行うことができます。あなたが明示的なメッセージを持っているなら、私はhandleMessageのアプローチを選択します。つまり、データを送受信する必要があります。何かをするだけなら、Runnableを使うことができます。しかしながら、両方の方法が使用可能であり、選択はしばしば好みの結果であろう。

AsyncTaskは、フードの下でハンドラを使用する上位概念です。それを使用すると、自分でスレッドを処理する必要はありません。非同期コードはスレッドプール経由で実行され、フレームワークによって制御されます。 UIスレッド(onPostExecuteonProgressUpdate)でコードを実行できる2つの方法があります。

一言で言えば、複数のスレッドを使用するほとんどの場合、AsyncTaskを選択すると、スレッド管理を自分で処理する必要がなくなります。独自のスレッドしか持たない場合は、ハンドラを使用してください。ただし、ハンドラを使用する必要がある場合もあります。たとえば、Messengerとなります。また、onProgressUpdateを使用すると十分ではない場合がありました。この場合は、doInBackgroundからハンドラも使用します。

+0

ありがとう、それは非常に明確な説明と私が探していたものでした – Ryan

1

多くの処理と大量のメッセージの受け渡しが必要な場合など、複雑なタスクにはおそらくAsynTasksが最適です。ハンドラを使ってそれらを達成することもできますが、個人的に言えば、コードはちょっと面倒です。

1

ハンドラ:それを作成したスレッドにバインドされます。メッセージキュー内のキュー/エンキューのタスク。メッセージをエンキューすると、それを作成したスレッド以外のスレッドに渡します。それをスレッドの代理人と考えてください。それはそれに送られた要求を処理し、それに応じてそれを委譲します。

投稿/メッセージ:上で説明したように、それはハンドラの投稿(キューイング)またはメッセージング(エンキュー)です。

Asynctask:主に小さなタスク用のスレッドで、バックグラウンドで実行する必要があり、進行状況に応じてUIを更新するものです(ローディングバーやダウンロードを考えると、UIはその進行状況で更新されます)。

+0

感謝を!それは少し明確になります – Ryan

0

ニードルをチェックすると、ハンドラーとAsynctasksを忘れることができます。 Needleはオープンソースで、Android用のシンプルで強力なマルチスレッドライブラリです。それを使用すると、のようなものを言うことができます。

Needle.onMainThread().execute(new Runnable() { 
    @Override 
    public void run() { 
     // e.g. change one of the views 
    } 
}); 

または

Needle.onBackgroundThread().execute(new UiRelatedTask<Integer>() { 
    @Override 
    protected Integer doWork() { 
     int result = 1+2; 
     return result; 
    } 

    @Override 
    protected void thenDoUiRelatedWork(Integer result) { 
     mSomeTextView.setText("result: " + result); 
    } 
}); 
  • 非常にシンプルなAPI
  • 固定スレッドプールサイズ
  • カスタマイズ可能なスレッドプールサイズ
  • は「(UIとの対話をサポートしていますUIスレッドで結果を使用する」)
  • a ndroid 1.5+
  • は、すべてのプラットフォームのバージョンで同じ動作をします

GitHubの上でそれをチェックアウト:https://github.com/ZsoltSafrany/needle