Android消息机制Hanlder

Hanlder线程之间发送消息就是以下三种:

 * 1.子线程向主线程发送消息
 * 2.主线程向子线程发送消息
 * 3.子线程向子线程发送消息
//子线程向主线程发送消息 实现一
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    final Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
    }
};
new Thread(new Runnable() {
    @Override
    public void run() {

        //hanler直接post一个Runnable Runnable运行与创建handler的线程  同hanldermessage()
        handler.post(new Runnable() {
            @Override
            public void run() {
                textView.setText("测试");
            }
        });
        handler.dispatchMessage(handler.obtainMessage());
    }
}).start();

}

子线程中使用Hanlder

private class MyThread extends Thread{

Handler handler1 = null;

@Override

public void run() {

//子线程创建使用handler 要使用Looper.propare()创建子线程的looper,然后Looper.loop()开始工作

//Looper中使用ThreadLocal来保存线程生成的looper

Looper.prepare();

handler1 = new Handler(){

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

//handler在哪个线程创建,handleMessage就运行在哪个线程

}

};

Looper.loop();

}

}

Looper.loop()方法运行在哪个线程 最终处理消息就是在对应的线程,Hanlder中的消息队列MessageQueue直接使用Looper中的MessageQueue,使用hanlder发送消息后消息进入对应的MessageQuene,然后对应的Looper从MessageQueue中拿到消息后执行。

主线程不用显示的调用Looper.prepare();Looper.loop();因为系统已经默认在运行主线程中调用过,主线程的Looper处于运行中。

 

Looper.loop()方法会不停的去MessageQueue中的Message,拿到消息Message后,调用Message方法的成员变量(Hanlder的实例target)的dispatchMessage(msg)方法

 

处理消息的三种方式(包括优先级):

1.Message消息自己的Runnable

2.Handler目标target的Callback

2.Handler中的空方法handleMessage(msg)

 

hanlder.post(Runnable runnable)的实际操作是生成一个Message消息体,将runnable赋值给Message,即为处理消息的方式一;

 

关于HanlderThread:

HandlerThread handlerThread = new HandlerThread("hanlder-thread");

handlerThread.start();//启动handler线程

 

//创建子线程(HanderThread)的Handler

final Handler handler2 = new Handler(handlerThread.getLooper()){

@Override

public void handleMessage(Message msg) {

//此时handlerMessage方法运行在指定的HandlerThread线程中

super.handleMessage(msg);

}

};

 

创建子线程Hanlder的时候,如果直接传入Looper会报空指针异常,因为Looper还没有准备,而系统给我们提供了一个可以使用的HanlderThread,其内部在获取Looper的方法getLooper()获取时,若looper没有准备使用了wait()来让HanlderThread线程等待,在执行的run()方法中准备好Looper用notifyAll()唤醒线程,即此时looper已经准备好。

 

//2.主线程向子线程发送消息   主线程中调用子线程的hanlder(因为是子线程的hanlder执行在子线程中)发送消息
handler2.sendMessage(handler2.obtainMessage());


//3.子线程向子线程发送消息 实现三
new Thread(new Runnable() {
    @Override
    public void run() {
        //当前子线程向HandlerThread子线程发送消息
        handler2.sendMessage(handler2.obtainMessage());
    }
}).start();

 

Looper 线程唯一,prepare()准备的时候会初始化Looper实例,存入ThreaLocal变量中,消息队列MessageQueue也同时初始化创建。looper()方法去消息后 dispatchMessage()方法下发执行。

Hanlder Hanlder实例创建的时候直接使用Looper中创建的MessageQueue,发送并处理消息 post(Runnable)先创建一个消息然后将Runnable传给消息的成员变量callback。enqueueMessage(msg)将消息加入队列

MessageQueue 消息队列 looper.loop()从中不停的取消息执行。enqueueMessage(msg,when)加入消息,next()取出消息。

Message 消息载体 内部包含一个消息池,最大数量是50,自身是一个单向链表。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android handler机制是一种在Android中用于处理异步消息线程通信的重要机制。其主要作用是将消息和任务抛到主线程消息队列中,以便主线程按照一定的规则按照队列中的顺序处理这些消息和任务。 1. Handler的实例化:在Android中,创建一个Handler的实例可以通过以下两种方式实现: 直接实例化: 创建一个Hanlder对象,代码示例: Handler handler = new Handler(); 绑定Looper:在子线程中创建Handler的话,需要先通过以下代码获取Looper对象,然后再将其传入Handler的构造函数中: Looper looper = Looper.myLooper(); Handler handler = new Handler(looper); 2. Handler的使用:当一个线程需要将一个耗时的任务交给主线程去执行的时候,它可以使用Handler来完成。以下是Handler的常见用法示例: 使用Handler处理消息Handler myHandler = new Handler() { public void handleMessage(Message msg) { //在这处理消息 } }; Message msg = myHandler.obtainMessage(); Bundle bundle = new Bundle(); bundle.putString("my_key", "my_string"); msg.setData(bundle); myHandler.sendMessage(msg); 使用Handler更新UI: Handler myHandler = new Handler() { public void handleMessage(Message msg) { //更新UI } }; myHandler.sendEmptyMessage(0); 3. Handler的原理:在Android系统中,所有的UI操作都必须在主线程上完成。这时,Handler就扮演了一个传递任务的中介角色。它把来自子线程消息和任务封装成Message对象,最后以一定的顺序扔到主线程消息队列中等待执行。主线程通过Looper不断地循环读取消息队列中的消息和任务,然后依次执行。这就是Handler机制的基本原理。 4. Handler配合其他机制使用:为了更好地发挥Handler的作用,还可与一些其他机制有效配合使用,例如:AsyncTask、MessageQueue等等。通过多种机制的相互配合,可以实现复杂的异步消息处理和并发控制,提升了Android应用程序的性能和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值