Androidの多线程之数Looper通信

 主线程与其他线程双向通信

handler+looper

一个线程绑定一个Handler,通过handler发送消息到被绑定的线程里,就可以在该线程里处理收到的消息了。

流程:

1.程序启动,主线程就开始在跑。

2.点击启动Other线程按钮,启动Other线程。(log打印Other线程已启动)

3.点击发动消息到Ohter按钮,发送消息到Ohter线程。(Other线程里打印接收到的消息,因为Other线程不可以操作ui,所以只有通过log显示出来)

4.Other线程收到消息后,又将消息发送到主线程,通过主线程的handler去处理ui。(收到Ohter线程,主线程的handler就可以通过一个TextView展示出来)

  1 package com.bvin.thread;
  2 
  3 import android.app.Activity;
  4 import android.os.Bundle;
  5 import android.os.Handler;
  6 import android.os.Looper;
  7 import android.os.Message;
  8 import android.util.Log;
  9 import android.view.View;
 10 import android.widget.Button;
 11 import android.widget.TextView;
 12 
 13 public class MainActivity extends Activity {
 14     /** Called when the activity is first created. */
 15     
 16     private Handler otherHandler;//工作线程的handler
 17     private Handler mainHandler;//主线程的handler
 18     
 19     private Button bt,bt1;
 20     private TextView tv;
 21     
 22     @Override
 23     public void onCreate(Bundle savedInstanceState) {
 24         super.onCreate(savedInstanceState);
 25         setContentView(R.layout.main);
 26         mainHandler = new Handler(){//主线程的handler可以处理ui(也可以接收其他线程发送过来的消息)
 27 
 28             @Override
 29             public void handleMessage(Message msg) {
 30                 // TODO Auto-generated method stub
 31                 super.handleMessage(msg);
 32                 tv.setText(msg.getData().getString("s"));
 33                 
 34             }
 35             
 36             
 37         };
 38         initViews();
 39         
 40     }
 41     
 42     private void initViews(){
 43         
 44         bt = (Button)findViewById(R.id.bt);
 45         bt1 = (Button)findViewById(R.id.bt1);
 46         tv = (TextView)findViewById(R.id.tv);
 47         
 48         bt.setOnClickListener(new View.OnClickListener() {
 49             
 50             @Override
 51             public void onClick(View v) {
 52                 // TODO Auto-generated method stub
 53                 new OtherThread().start();//启动Other线程
 54             }
 55         });
 56         bt1.setOnClickListener(new View.OnClickListener() {
 57             
 58             @Override
 59             public void onClick(View v) {
 60                 // TODO Auto-generated method stub
 61                 Message msg = Message.obtain();
 62                 Bundle data = new Bundle();
 63                 data.putString("s", ""+bt1.getText().toString());
 64                 msg.setData(data);
 65                 otherHandler.sendMessage(msg);//从主线程发送消息到Other线程(因为otherHandler被绑定到Other线程,所以可以在Other线程里接收到消息)
 66             }
 67         });
 68         
 69     }
 70     
 71     class OtherThread extends Thread{
 72 
 73         @Override
 74         public void run() {
 75             // TODO Auto-generated method stub
 76             super.run();
 77             Log.e("线程启动...", ""+Thread.currentThread().getName());
 78             Looper.prepare();//消息循环
 79             otherHandler = new Handler(){
 80 
 81                 @Override
 82                 public void handleMessage(Message msg) {//这里可以接收到主线程发送过来的消息
 83                     // TODO Auto-generated method stub
 84                     super.handleMessage(msg);
 85                     Log.e("收到主线程发送过来的消息:", msg.getData().getString("s"));
 86                     Message msg1 = new Message();
 87                     Bundle data = new Bundle();
 88                     data.putString("s", "从Other线程传过来的消息");
 89                     msg1.setData(data);
 90                     mainHandler.sendMessage(msg1);//用主线程的handler发送消息,就可以在主线程接收到消息
 91                 }
 92             };
 93             Looper.loop();//跑起MessageQueue
 94         }
 95         
 96         
 97         
 98         
 99     }
100 }
原文地址:https://www.cnblogs.com/bvin/p/2782727.html