2

もともとは単純なスレッドとハンドラーを使用していたので、HandlerThreadクラスを見てきましたが、AndroidでNetworkOnMainThreadExceptionが発生したクロッパーが登場しました。

ソケットのようなものをHandlerThreadに導入する方法を理解できないようです。これは、ブロッキングコードを実行する場所です。ただし、ルーパーがある場所であるrunをオーバーライドするべきではないため、HandlerThreadを使用してこれを行うことはできません。

また、メッセージを介してHandlerThreadを呼び出して、ソケットでのリッスンを開始することはできません。これは、それに渡される他のメッセージをブロックするためです。

では、このHandlerThreadクラスは、非ブロッキングのタスク用に設計されていますか?そのようなスレッドをどのように使用してソケットでリッスンできるのか理解できないようですが、メインUIスレッドから通常のスレッドを作成していたときのようにリクエストを処理できます

通常のスレッドでは、実行中にLooper.prepare()とLooper.loop()を呼び出してから、これら2行の間にコードを配置することができます(ハンドラーを作成するためのチェックを使用)が、通信に問題がありますこの新しいスレッドでは、メッセージはスレッドに渡されません。

では、ハンドラーを使用して相互に通信し、ソケットの使用などのタスクを実行できるスレッドを作成するにはどうすればよいですか。

ASyncTaskコメントの使用を探していません。スレッドが相互に通信できるように、自分でスレッドを使用する方法を知りたいです。

4

1 に答える 1

1

メッセージの実行を待機しHandlerThreadているワーカースレッドと考えてください(これにより、新しいメッセージが生成される可能性があります)。したがって、それと通信するには、オブジェクトを準備してハンドラーにディスパッチするだけです(たとえば、ソケット読み取り用に新しいものを開始できます) 。LooperThreadMessagethread

Handler handler = new Handler(handlerThread.getLooper()){
   @Override
   public void handleMessage(Message msg) {
      // Do action based on this message
   }
}

通常、たとえばを必要とするHandlerThreadものを聞いているときに便利です。eventsLooperrequestLocationUpdates

を使用する必要はありません(質問に従って使用している場合、この例外がどのように発生するかはわかりません)。で使用するにHandlerThreadNetworkOnMainThreadException、通常のスレッドを使用して、メソッドで操作を実行します。Threadsocketssocketrun

于 2013-02-19T23:07:21.377 に答える