写在前面:
一直对Android消息机制的实现比较感兴趣,尤其是最近在做开发时大量使用这种机制进行网络数据处理后的显示,很有必要进一步总结一下,之前有写过关于消息机制的文章,但是现在看来理解的实在是太肤浅了。在此一并归纳,也算是对之前落下任务的一个交代吧。
首先从一个经典的主线程和子线程进行消息通信的实例入手,一步步进行解析。
主线程和子线程之间消息通信实例
该例子完成了主线程和子线程之间循环发送消息的功能,子线程将一段字符发给主线程,主线程用Toast展示出来,线程之间每隔两秒进行一次消息传递。
主线程类代码如下:
1.package com.elvis.handlerGoActivity;
2.import android.app.Activity;
3.import android.os.Bundle;
4.import android.os.Handler;
5.import android.os.Message;
6.import android.widget.Toast;
7./**
* 这个类是主线程,它每隔两秒就发送一个Message给线程,线程收到Message后9将发送一个Message给主线程,主线程收到Message后会将Message内容Toast出10来
*/
10.public class HandlerTestActivity extends Activity {
11 private Handler uiHandler;
12 private ThreadWithLooper thread;
13 private Runnable showRunable;
14 @Override
15 public void onCreate(Bundle savedInstanceState) {
16 super.onCreate(savedInstanceState);
17 setContentView(R.layout.main);
18 uiHandler=new Handler(){
19 @Override
20 public void handleMessage(Message msg) {
21 switch(msg.what){
22 case Messages.MSG_HELLO:
23 Toast.makeText(HandlerTestActivity.this, (String)msg.obj, Toast.LENGTH_SHORT).show();
24 break;
25
26 }
27 }
28 };
29 thread=new ThreadWithLooper(uiHandler);
30
31 thread.start();
32 showRunable=new Runnable() {
33
34 @Override
35 public void run() {
36 //給线程发送一个Message
37thread.getHandler().sendEmptyMessage(Messages.MSG_HELLO);
38 uiHandler.postDelayed(this, 2*1000);
39 }
40 };
41 uiHandler.post(showRunable);
42
43 }
44
45 @Override
46 protected void onStop() {
47 super.onStop();
48 uiHandler.removeCallbacks(showRunable);
49 }
50}
子线程类代码:
1package com.elvis.handlerGoActivity;
2import android.os.Handler;
3import android.os.Looper;
4import android.os.Message;
5
6/**
* 从线程发送消息到UI线程&