Handle发送消息机制

本文介绍了Android中Handle实现线程间通信的工作原理。Handle用于线程间传递消息,配合Looper和MessageQueue进行消息循环处理。在主线程中,可以直接创建Handler进行消息处理。而在子线程中,需要先调用Looper.prepare()初始化Looper,然后创建Handler,并通过Looper.loop()开始消息循环。文章通过代码示例展示了如何在主线程和子线程中发送及接收消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 *
 handle主要用于线程之间的通信,传递消息,数据等;ui线程底层封装了looper,可以直接new handle,在子线程中使用handle 
 要先调用looper.prepare(),实例完handle,要调用looper.loop(),looper用来不停的循环传递消息,messageque携带message 
 handle 收发消息,looper相当于传送带,messageque相当于货箱,handle相当于工人。


 在主线程中 使用 handler,子线程像主线程发送消息

 public class MainActivity extends Activity {


 private Button btn1 ;

 private Handler handler = new Handler(){
 //从写handleMessage方法  处理 工作线程发送过来的消息
 public void handleMessage(Message msg) {
 int str1 = msg.arg1;
 int str2 = msg.arg2;
 String str3 = (String)msg.obj;
 int str4 = msg.what;

 Bundle bundle = msg.getData();

 Log.i("==Tag==", "=Str1="+str1+"=str2="+str2+"=str3="+str3+"=str4="+str4+"==bundle="+bundle.getString("str"));
 };
 };
 @Override protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 btn1 = (Button)findViewById(R.id.btn1);

 btn1.setOnClickListener(new OnClickListener() {

 @Override public void onClick(View v) {
 // TODO Auto-generated method stub
 new Thread(){
 @Override public void run() {
 // TODO Auto-generated method stub
 super.run();

 //Message msg = new Message();//不能new  消耗内存
 Message msg = Message.obtain();
 msg.arg1 = 100;
 msg.arg2 = 200;//传递int 类型数据
 msg.obj = "sssss";//传递对象类型
 msg.what = 1;//标志当前信息

 //传递一个数据量较大的数据
 Bundle bundle = new Bundle();
 bundle.putString("str", "bundle");
 msg.setData(bundle);
 handler.sendMessage(msg);//发送消息
 }
 }.start();
 }
 });
 }

 }

 在子线程中使用handler,主线程向子线程发送消息,子线程要准备一个looper

 public class MainActivity extends Activity {


 private Handler handler;
 @Override protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 }

 //开启子线程
 public void start(View v){
 new MyThread().start();
 }


 //主线程向子线程发送数据
 public void send(View v){
 Message msg = Message.obtain();
 msg.what = 100;
 msg.obj = "asdfghjkl";
 handler.sendMessage(msg);

 }


 //自定义工作线程
 public class MyThread extends Thread{
 @Override public void run() {
 // TODO Auto-generated method stub
 super.run();
 Looper.prepare();//创建looper对象
 //接受主线程 发送来的数据
 handler = new Handler(){
 @Override public void handleMessage(Message msg) {
 // TODO Auto-generated method stub
 super.handleMessage(msg);
 int str = msg.what;
 String str1 =(String)msg.obj;
 Log.i("==TAG==", "==str=="+str+"==str1=="+str1);
 }
 };
 Looper.loop();//使用loop而里的循环  取出数据
 }
 }


 }
 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值