Androidの多线程之数Looper通信

来源:互联网 发布:网上淘宝贷款是真的吗 编辑:程序博客网 时间:2024/06/06 00:44

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

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 }