Android的消息处理:Looper,Handler和Message

Handler: 主要用于 发送及处理 子线 Message 数据, 并用这些数据配合主线程更新UI等操作。(用 handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等。 Handler对象与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。
Message:包含消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理。
Looper: 管理线程里的MessageQueue(消息队列) ,会 不断地从MessageQueue中抽取Message执行,一个MessageQueue需要一个Looper。
MessageQueue:消息队列, Handler发送过来的 Message 消息 以链表的方式串联起来的 ,并按照FIFO规则执行,等待Looper的抽取。

更多说明:
Android主线程 (也是UI线程)不可以放耗时操作( 联网读取数据,大文件操作等 ),否则超过五秒会有无响应提示; 耗时操作需要放在子线程中进行,但 Android的 UI线程( 主线程 是线程是不安全的 ,更新UI只能在主线程中更新。所以需要通过 运行在主线程中(UI线程中)的 Handler
对象与子线程间通过Message对象进行 数据 传递 ,然后把这些消息放入主线程队列中,配合主线程进行更新UI。
在Android里线程分为有消息循环的线程(looper线程)和没有消息循环的线程,有消息循环的线程一般都会有一个Looper,这个是Android的新概念。主线程(UI线程)就是一个 消息循环的线程。针对这种消息循环的机制,引入一个新的机制Handler,有消息循环就要往消息循环里面发送相应的消息,自定义消息一般都会有对应的处理,消息的发送和清除,消息的处理,把这些都封装在Handler里面,注意Handler只是针对那些有Looper的线程,不管是UI线程还是子线程,只要有Looper,就可以往消息队列里面添加东西,并做相应的处理。

Handler使用:
Handler可以分发Message对象和Runnable对象到主线程中,每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),它有两个作用:
(1)安排消息或Runnable 在某个主线程中某个地方执行;
(2)安排一个动作在不同的线程中执行。
Handler中分发消息的一些方法
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
以上post类方法允许你排列一个Runnable对象到主线程队列中,
sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新。

Handler实例:
子类需要继承Hendler类,如果是处理 Message数据,并必须要重写handleMessage(Message msg)方法。
以下为一个实例,它实现的功能为: 通过线程修改界面Button的内容

public class MyHandlerActivity extends Activity {
    Button button;
    MyHandler myHandler;
 
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.handlertest);
 
        button = (Button) findViewById(R。id。button);     
	//无参数的构造函数,默认用了本线程的looper,所以如果是在非ooper线程里要先prepare()把当前线程变为looper线程,让咱通过loop()方法启动循环
	myHandler = new MyHandler();//如果在子线程中要生成主线程的可以写new Handler(Looper.getMainLooper())
        //当创建一个新的Handler实例时, 它会绑定到当前线程和消息的队列中,开始分发数据
        //Handler有两个作用, (1) : 定时执行Message和Runnalbe 对象 (2): 让一个动作,在不同的线程中执行。
 
        //myHandler.post(Runnable)
        //myHandler.postAtTime(Runnable,long)
        //myHandler.postDelayed(Runnable,long)
        //以上方法以post开头的允许你处理Runnable对象,把Runnable对象排入MessageQueue

        //myHandler.sendEmptyMessage(int)
        //myHandler.sendMessage(Message);
        //myHandler.sendMessageAtTime(Message,long)
        //myHandler.sendMessageDelayed(Message,long)
        //myHandler.sendMessage()//允许你处理Message对象(Message里可以包含数据),需要重写handleMessage(Message msg)方法
 
        MyThread m = new MyThread();
        new Thread(m).start();
    }
 
    /**
    * 接受消息,处理消息 ,此Handler会与当前主线程一块运行
    * */
    class MyHandler extends Handler {
        public MyHandler() {
        }
        public MyHandler(Looper L) {
            super(L);
        }
        //子类必须重写此方法,接受数据
        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            Log.d("MyHandler", "handleMessage。。。。。。");
            super.handleMessage(msg);
            // 此处可以更新UI
            Bundle b = msg.getData();
            String color = b.getString("color");
            MyHandlerActivity.this.button.append(color);
        }
    }
    class MyThread implements Runnable {
        public void run() {
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Log.d("thread......", "mThread.....");
            Message msg = new Message();
            Bundle b = new Bundle();// 存放数据
            b.putString("color", "我的");
            msg.setData(b);
 
            MyHandlerActivity.this.myHandler.sendMessage(msg); // 向Handler发送消息,更新UI
        }
    }
} 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值