android通过Handler在线程之间传递消息

这个demo介绍了通过Handler在线程之间传递消息,demo中一个三个线程,主线程,发送消息的分线程,接收消息的分线程。发送消息的分线程会通知主线程更改标签文字,同时会通知接收消息的分线程更改进度条的进度。

demo:下载地址

运行截图:



源码:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package fk.androiddemo_005;  
  2. //工作线程不能直接修改主线程的控件,只能通过handler传递信息  
  3. //对于以上,progressBar控件除外  
  4. //通过handler-looper可以实现在各个线程之间传递信息  
  5. import android.os.Handler;  
  6. import android.os.Looper;  
  7. import android.os.Message;  
  8. import android.support.v7.app.AppCompatActivity;  
  9. import android.os.Bundle;  
  10. import android.view.View;  
  11. import android.widget.Button;  
  12. import android.widget.ProgressBar;  
  13. import android.widget.TextView;  
  14.   
  15. public class MainActivity extends AppCompatActivity implements View.OnClickListener{  
  16.     Button but;  
  17.     TextView text;  
  18.     ProgressBar proBar;  
  19.     MyHandler handler;//定义handler  
  20.     Handler handler2;  
  21.     Message msg;  
  22.     @Override  
  23.     protected void onCreate(Bundle savedInstanceState) {  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.activity_main);  
  26.   
  27.         but=(Button)findViewById(R.id.but);  
  28.         but.setOnClickListener(this);  
  29.         text=(TextView)findViewById(R.id.text);  
  30.         proBar=(ProgressBar)findViewById(R.id.proBar);  
  31.   
  32.         handler=new MyHandler();//在主线程中实现handler,就会在主线程中用Looper处理其msg  
  33.         new MyAcceptThread().start();//开启接收信息线程(先开,因为handler2是在这个线程里实现的)  
  34.     }  
  35.   
  36.     @Override  
  37.     public void onClick(View v) {  
  38.         new MySendThread().start();//开启发送信息线程  
  39.     }  
  40.   
  41.     //   发送信息的线程类  
  42.     class MySendThread extends Thread{  
  43.         public void run(){  
  44.             int i=0;  
  45.             while(i!=10){  
  46.                 Bundle bundle=new Bundle();  
  47.                 bundle.putString("num","第"+i+"次");//bundle中也可以放序列化或包裹化的类对象数据  
  48.                 msg=handler.obtainMessage();//每发送一次都要重新获取  
  49.                 msg.setData(bundle);  
  50.                 handler.sendMessage(msg);//用handler向主线程发送信息  
  51.   
  52.                 msg=handler2.obtainMessage();  
  53.                 msg.what=i;  
  54.                 handler2.sendMessage(msg);//用handler2向myAcceptThread线程发送信息  
  55.   
  56.                 //休眠3秒,需要异常处理  
  57.                 try {  
  58.                     Thread.sleep(3000);  
  59.                 } catch (InterruptedException e) {  
  60.                     e.printStackTrace();  
  61.                 }  
  62.                 i++;  
  63.             }  
  64.         }  
  65.     }  
  66.   
  67.     //接收信息的线程类  
  68.     class MyAcceptThread extends Thread{  
  69.         public void run(){  
  70.             Looper.prepare();//准备Looper对象  
  71.             //在分线程中实现handler2,就会在分线程中处理其msg  
  72.             handler2=new Handler(){//这是用匿名内部类生成一个handler对象  
  73.                 public void handleMessage(Message msg) {  
  74.                     proBar.setProgress(msg.what);  
  75.                 }  
  76.             };  
  77.             //调用Looper的loop方法后,Looper对象将不断从消息队列中取出消息对象并交给handleMessage处理  
  78.             //没有消息时该线程会阻塞  
  79.             Looper.loop();  
  80.         }  
  81.     }  
  82.   
  83.     //自定义handler类  
  84.     class MyHandler extends Handler{  
  85.         @Override  
  86.         //接收别的线程的信息并处理  
  87.         public void handleMessage(Message msg) {  
  88.             Bundle bundle=msg.getData();  
  89.             text.setText(bundle.get("num").toString());  
  90.         }  
  91.     }  
  92. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值