• 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 }
  • 相关阅读:
    Android Lock Screen Orientation
    android studio修改新项目package名称
    DevExpress控件GridView挂下拉控件无法对上值
    Datawindow.net+access数据窗口制作方法
    LR11中web_save_timestamp_param
    LR自带网站飞机订票系统 启动
    MySQL ODBC驱动安装和配置数据源
    【笔记】LR配置ODBC连接数据库进行参数化(mysql )未完待续
    【笔记】LR录制方式和常用函数
    【笔记】http1.1支持的7种请求方法
  • 原文地址:https://www.cnblogs.com/bvin/p/2782727.html
Copyright © 2020-2023  润新知