主线程与其他线程双向通信
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 }