Android学习笔记(十三) Handler

可用于解决上一则笔记所提到的WorkerThread无法修改UI控件的问题

一、Handler、Looper和MessageQueue的基本原理

  Handler把消息对象放到MessageQueue当中,而Looper负责在消息队列头部不断取出消息对象。取出的对象再交给Handler处理。

二、一个简单的Handler例子

  -先创建一个继承Handler的类,注意是导入Android.os.Handler(非常重要)
    class firstHandler extends Handler{}

  -复写方法handleMessage(Message msg)

  -创建Handler对象
    handler = firstHandler()

  -生成一个Message,并且给what成员变量赋值
    Message msg = handler.obtainMessage();
    msg.what = 2;

  -将消息对象放置到消息队列中。
    handler.sendMessage(msg);

  -Looper将会从消息队列当中将消息对象取出;
  -Looper将会找到与消息对象对应的Handler对接(每一个Message对象都有与之对应的Handler对象);
  -Looper将会调用Handler对象的handleMessage(Message msg)方法,用于处理消息对象。

三、在主线程当中实现Handler的handleMessage()方法

  注:不管是在WorkerThread还是在MainThread中都可以发送消息,即:handler.sendMessage(Message msg)

  1)在新建线程的run()中发送Message:

    class NetworkThread extends Thread{
        @Override
        public void run(){
            String s = "模拟从网络中获取的数据";
            Message msg = handler.obtainMessage();
            msg.obj = s;
            handler.sendMessage(msg);    
        }
    }                    

  2)复写handleMessage()方法。因为这个方法是被主线程调用的,所可以更改UI。

class MyHandler extends Handler{
    @Override
    public void handleMessage(Message msg){
        tring s = (String)msg.obj;
        textView.setText(s);
    }
}

 四、主线程向WorkerThread发送数据

  1)在WorkerThread中

//在WorkerThread当中启动Looper,重写Handler的handleMessage()方法
//如果是MainThread接收消息则不需要写Looper的方法,只需要写handleMessage()方法
class WorkerThread extends Thread{
    @Override
    public void run(){
        //准备Looper对象
        Looper.prepare();
        //在WorkerThread当中生成Handler对象
        handler = new handler(){
            @Override
            public void handleMessage(Message msg){
            
            }
        }
        //调用Looper的loop()方法之后,Looper对象将不断地从消息队列中取出消息对象,然后调用handler的handleMessage()方法,处理该消息对象
        //如果消息队列当中没有对象,则该线程阻塞
        Looper.loop();
    }
}
//启动WorkerThread线程
WorkerThread wt = new WorkerThread();
wt.start;

  2)在MainThread中

//在MainThread中发送消息(利用Button)
button.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View view){
        Message msg = handler.obtainMessage();
        handler.sendMessage(msg);
    }
})
原文地址:https://www.cnblogs.com/viaduct/p/6388010.html