1

Android 用の Google の gtalksms は、Service 内で Handler を使用します。ハンドラー スレッドを開始すると、スレッド ID が格納され、ハンドラーで次のチェックが行われます。

if (Thread.currentThread().getId() != mHandlerThreadId) {
        throw new IllegalThreadStateException();
}

私の質問は、なぜこの種の小切手が必要なのですか? それは良い習慣か何かですか?私はマルチスレッドに非常に慣れていません。

編集:

明確にするために、これは HandlerThread です。

    HandlerThread handlerThread = new HandlerThread("My.Service");
    handlerThread.start();
    mHandlerThreadId = handlerThread.getId();
    ServiceHandler serviceHandler = new ServiceHandler(handlerThread.getLooper());
4

1 に答える 1

2

なぜこの種のチェックが必要なのですか?

このステートメントは、メソッドが HandlerThread で実行されていることを確認します。通常、オブジェクトまたはプロセスをシングル スレッドにする必要がある場合、これはオブジェクトが適切に使用されていることを確認する 1 つの方法です。誰かが複数のスレッドから呼び出した場合、例外が発生します。

一般的な例の 1 つは、ほとんどの場合シングル スレッドであることが意図されている GUI です。一部の実装では、これらの種類のチェックを行って、常に UI スレッドから UI コンポーネントを変更していることを確認します。

この特定のケースでは、そのライブラリの詳細はわかりませんが、マルチスレッド環境で期待どおりに動作しないと思われ、開発者はそのような使用を禁止するためにそのチェックを導入しました。

注: 技術的には、2 つのスレッドが同じ ID を持っている可能性は低いですが、不可能ではないため、次のようにチェックすることもできます。if (Thread.currentThread().equals(handlerThread));

于 2013-05-12T20:35:30.130 に答える