2

本を介してAndroidを学ぶ初心者であり、スレッド化については、本で説明されている3つの主な方法があることがわかります。

  • メッセージングを介したハンドラー
  • ポスト経由のハンドラー
  • 非同期タスク

3つすべてが良さそうですが、私の質問は次
のとおりです。上記のいずれかを使用する特定の時期はありますか?それとも個人的な好みですか?

編集:
個人的な好みではない場合は、一方を使用する場合と他方を使用しない場合の例を教えてください(リンクをいただければ幸いです)

複数のスレッドを実行することを計画しているため(たとえば、1つはアプリの合計実行時間、1つはアプリで回答が選択されるまでの時間など、もう1つは背景画像の移動など)、どれを選択するかを知りたいためです。私はこれらの3つの方法のいずれかを使用して、私が望む機能を実行できるので、どちらかで実行できるのになぜ3つあるのか混乱しています。

ありがとう!

4

4 に答える 4

2

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

AsyncTask内部でハンドラーを使用する高レベルの概念です。これを使用すると、スレッドを自分で処理する必要がなくなります。非同期コードはスレッドプールを介して実行され、フレームワークによって制御されます。onPostExecuteUIスレッド(および)でコードを実行できる2つのメソッドがありますonProgressUpdate

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

于 2011-07-24T17:22:07.350 に答える
1

AsynTasksは、多くの処理と多くのメッセージパッシングが必要な場合など、複雑なタスクにおそらく最適です。ハンドラーを介してそれらを達成することもできますが、個人的に言えば、コードはそのように少し厄介になります。

于 2011-07-24T16:58:55.953 に答える
1

ハンドラー:それを作成したスレッドにバインドされています。メッセージキュー内のキュー/エンキューのタスク。メッセージをキューに入れると、メッセージを作成したスレッドとは別のスレッドにメッセージを渡します。スレッドのエージェントと考えてください。送信されたリクエストを処理し、それに応じて委任します。

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

Asynctask:主にバックグラウンドで実行し、進行状況に応じてUIを更新する必要がある小さなタスク用のスレッドです(読み込みバーまたはダウンロードを考えてください。UIはその進行状況で更新されます)。

于 2011-07-24T16:59:35.803 に答える
1

Needleをチェックしてください。ハンドラーと非同期タスクを忘れることができます。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スレッドで結果を使用する」)
  • android 1.5+
  • すべてのプラットフォームバージョンで同じように動作します

GitHubでチェックしてください:https ://github.com/ZsoltSafrany/needle

于 2014-08-19T13:43:58.053 に答える