子スレッドとメインスレッド間の通信に関連した共通の更新UIのAndroidなどスレッド間通信は、実装はハンドラ+ルーパーですが、GoogleはHandlerThreadをカプセル化して、独自のマニュアルルーパーに、推奨されていない場合クラス(AsyncTaskクラスに似ています)。
サブハンドラ・スレッドにメッセージを送信するタスク、子スレッド・ハンドラの再利用HandlerThreadを実行する子スレッドは、メインスレッドの更新UIにメッセージを送ります
パブリック クラス MainActivity 延びAppCompatActivity { のTextViewのTextView、 ボタンボタン、 MainHandler MainHandlerと、 保護された ボイドのonCreate(バンドルsavedInstanceState){ スーパー.onCreate(savedInstanceState); setContentView(R.layout.activity_main) のTextView = findViewById(R.id.text)。 ボタン = findViewById(R.id.button); //は、これは彼女に新しいハンドラルーパーがない場合に渡された知識があれば、彼は現在実行中のデフォルトの連絡先のルーパ糸に行くと、メインスレッドハンドラのインスタンスである mainHandler =を新しい新しい MainHandler(この); HandlerThread HandlerThread = 新新 HandlerThread( "第一" ); handlerThread.startは(); // これは、ハンドラの子供がルーパーhandlerThreadの着信リンクスレッドで 決勝ハンドラchildHandler = 新しい新しいハンドラ(handlerThread.getLooper()){ int型の COUNT = 0を; @Override 公共 のボイドのhandleMessage(メッセージMSG){ スーパー.handleMessage(MSG); System.out.printlnはは( +「子スレッドハンドラは、現在の実行のメインスレッドにデータを送信するデータを受信した」。にThread.currentThread()のgetName( )); // 彼女のハンドラのUI更新のメインスレッドにメッセージを送信 Message.obtain(MainHandler ,. 1、++ COUNT).sendToTargetは(); } }; // コール情報伝送のスレッドを開きchildHandler button.setOnClickListener(新しい新しいView.OnClickListener(){ @Override 公共 ボイドのonClick(ビューV) { 新しい新しいスレッド(新しい新しいRunnableを(){ @Override 公共 ボイドRUN(){ System.out.printlnは( + "のデータ送信子スレッド" にThread.currentThread()のgetName())を;. // ハンドラhandlerThreadに送信 childHandler.sendEmptyMessage(1 ); } })スタート(); } }); } // これは、メモリリークを防止することができ、この形態のメインスレッドがハンドラを定義され たクラスを MainHandler 延びハンドラ{ プライベート弱い参照<MainActivity> mainActivityWeakReferenceと、 MainHandler(MainActivity MainActivity){ この .mainActivityWeakReference = 新しい新しい弱い参照<> (MainActivity); } @Override 公共 ボイドのhandleMessage(メッセージMSG){ スーパー.handleMessage(MSG)。 mainActivityWeakReference.get()textView.setText(msg.obj。 + "" ); } } }