Handle发送消息机制

来源:互联网 发布:简易画图纸软件 编辑:程序博客网 时间:2024/05/19 14:54
/** * 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而里的循环  取出数据 } } } */
0 0
原创粉丝点击