Looper、MessageQueue和Hanlder是Android系统的核心之一,系统四大组件在Client端和Server端进行交互依赖于此。所以了解这几个系统类之间的关系,非常重要。下面就分别介绍这三个模块:
1.Looper:
Looper用来处理线程的消息循环,默认线程是没有消息循环队列的,需要执行prepare或者prepareMainLooper方法创建Looper对象,调用loop开启消息循环。
获取线程(或者主进程)的Looper,使用myLooper()方法获取,最终通过sThreadLocal.get()方法获取,ThreadLocal给每个子线程存储一个备份,所以一个子线程(或者主线程)只有一个Looper。
2.MessageQueue
MessageQueue包含了需要Looper处理的Message,MessageQueue不能直接添加Message而是通过Handler。
MessageQueue是由Looper初始化的时候创建的:
3.Handler
Handler是用来向MessageQueue传入Message信息,异步处理Message信息。
Handler有两种执行方式:
3.1 可以执行post方法(post方法本质是在方法内部重新封装了Message,回调方法是callback方法,见下图)
3.2 sendMessage(回调方法是handleMessage方法,这个是需要开发者重写的)方法向MessageQueue中加入Message信息。
Handler一般处理Message都是异步的,但是有一个例外执行runWithScissors方法。
创建Handler时一般需要指定需要Handler需要处理Looper(间接指定了Message加入
的MessageQueue、Message处理的线程)。
如果没有指定,默认使用Handler所处线程或者主线程的Looper。
4.Android开发中需要注意的事项
1)在子线程中启动Toast会弹框报错Can’t toast on a thread that has not called Looper.prepare()。Toast的显示因为Toast的显示是通过Handler来实现的,子线程不指定Looper会导致Crash。
2)Android封装类HandlerThread:HandlerThread类继承Thread,该类自建了Looper。
3)Android封装类Messenger:系统可以使用Messager进行进程间通信。