Android 之 Handler 知识摘要

    xiaoxiao2021-04-03  33

    这里 handler的概念就不做介绍,若还不知道handler是啥的同学请移步。

    首先说下handler messager looper之间的关系:

    looper: 一个线程只有一个looper对象,looper对象用以管理该线程中的MessageQueue (消息队列)

    handler:handler 用以和looper沟通(push消息到MQ队列中,或者接受looper从消息队列中取出的消息) 

    messageQueue:  消息队列 用来存放线程放入的消息

    利用handler更新主线程有三个方法:

    1. handler.post()

    new Thread() { @Override public void run() { //在run()方法实现业务逻辑; //... //更新UI操作; handler.post(new Runnable() { @Override public void run() { text.setText(使用Handler更新了界面); } }); } }.start();

    2. handler.post()

    这个方法和第一个很像  但是它是新建了一个实现了Runnable借口的内部类。在内部类中更新UI进程。

    new Thread() { @Override public void run() { handler.post(myRunnable);//调用Handler.post方法; } }.start(); } class MyRunnable implements Runnable {//内部类实现Runnable接口; @Override public void run() {//还是在Runnable重写的run()方法中更新界面; text.setText(使用Handler更新了界面); } } }

    3.handler.sendMessage和handleMessage 搭配处理。

    这算是用的较多的方法了。不难理解,看代码。

    private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case 1: text.setText(使用Handler更新了界面); break; } } }; new Thread() { @Override public void run() { //...你的业务逻辑; //发送一个消息,该消息用于在handleMessage中区分是谁发过来的消息; Message message = Message.obtian(); message.what = 1; handler.sendMessage(message); } }.start(); 大家都熟悉 在子线程中执行耗时操作,然后将结果返回主线程。也就是说,子线程持有主线程的handler实例,在子线程中通过handler来sendmessage,达到传递数据的目的。但如果是想要从主线程中发消息给子线程呢?

    这就涉及到一个问题: 如何在子线程中创建handler ?

    主线程中创建handler时,系统会默认调用了looper.prepare() looper.loop() 等方法,但是子线程不同,我们需要手动调用looper.preprare()和 looper.loop方法。

    当执行完prepare方法时,该线程才有MessageQueue和Looper对象,但此时 Looper还未开始轮询(轮询机制 以依次取出消息队列中的消息)。

    当创建handler时 (handler有重载构造方法,可以选择传入参数messagequeue和looper) 若没有指定handler将要锁定的MessageQueue和Looper时,则默认锁定该线程的MQ和Looper。

    最后 调用looper.loop()方法 以开始轮询。

    转载请注明原文地址: https://ju.6miu.com/read-665895.html

    最新回复(0)