Looper循环者,Handler消息处理类

Looper循环者

Looper对象用来为一个线程开启一个消息循环。默认情况下,Android中新创建的线程是没有开启消息循环的,但主线程除外。系统自动为主线程创建Looper对象,开启消息循环。在新创建的非主线程中创建Handler对象,需要先使用Looper类的prepare()方法来初始化一个Looper对象,然后创建该Handler对象,再使用Looper类的loop()方法启动Looper,从消息队列中获取和处理消息。

Looper类常用方法:

prepare()   用于初始化Looper
loop()   启动Looper线程,线程会从消息队列里获取和处理消息  
myLooper()   可以获取当前线程的Looper对象
getThread()  用于获取Looper对象所属的线程
quit()   用于结束Looper循环
handler.getLooper()   获取该Handler的Looper

注意:

写在Looper.loop()之后的代码不会被执行,该函数内部是一个循环,当调用Handler.getLooper().quit()方法后,loop()方法才会中止,其后面代码才能运行

    //非主线程
    public class MyThread extends Thread{
        public Handler handler;
        public void run() {
            Looper.prepare();
            handler=new Handler(){
                public void handleMessage(@NonNull Message msg) {
                    //执行代码
                }
            };
            Looper.loop();
            // .loop()以下代码在 .quit()前不执行
        }
    }

    //主线程中
    MyThread myThread=new MyThread();
    myThread.start();
    myThread.handler.sendMessage( ~ );

Handler消息处理类

Handler允许发送和处理MessageRunnable对象到其所在线程的MessageQueue中。主要作用有:

(1) 将Message或Runnable应用 post()sendMessage() 方法发送到MessageQueue中,在发送时可以指定延迟时间、发送时间及要携带的Bundle数据。

(2) 在子线程中与主线程通信,即与UI主线程通信

一个线程中只能有一个Looper和一个MessageQueue,但可以有多个Handler,而且这些Handler可以共享一个Looper和MessageQueue

Handler类常用方法

handleMessage(Message msg)  处理消息的方法,通常重写该方法,在发送消息时自动回调
post(Runnable r)  立即发送Runnbalde对象,该对象最后会封装成Message
postAtTime(Runnable r,long uptimeMillis) 定时发送Runnbalde对象,该对象最后会封装成Message
postDelayed(Runnable r,long delayMillis) 延时发送Runnbalde对象,该对象最后会封装成Message
sendEmptyMessage(int what)  发送空消息
sendMessage(Message msg,long uptimeMillis)  立即发送消息
sendAtTime(Message msg,long uptimeMillis)   定时发送消息
sendDelayed(Message msg,long delayMillis)   延时发送消息

你可能感兴趣的:(java,android)