1、Android中为什么主线程不会因为Looper.loop()里的死循环卡死
https://coding.imooc.com/learn/questiondetail/16895.html
简单的说可以:Android应用程序的主线程在进入消息循环过程前,会在内部创建一个Linux管道(Pipe),这个管道的作用是使得Android应用程序主线程在消息队列为空时可以进入空闲等待状态,并且使得当应用程序的消息队列有消息需要处理时唤醒应用程序的主线程。
具体来说是:Android应用程序的消息处理机制由消息循环、消息发送和消息处理三个部分组成的。Android应用程序的主线程在进入消息循环过程前,会在内部创建一个Linux管道(Pipe),这个管道的作用是使得Android应用程序主线程在消息队列为空时可以进入空闲等待状态,并且使得当应用程序的消息队列有消息需要处理时唤醒应用程序的主线程。Android应用程序的主线程进入空闲等待状态的方式实际上就是在管道的读端等待管道中有新的内容可读,具体来说就是是通过Linux系统的Epoll机制中的epoll_wait函数进行的。当往Android应用程序的消息队列中加入新的消息时,会同时往管道中的写端写入内容,通过这种方式就可以唤醒正在等待消息到来的应用程序主线程。当应用程序主线程在进入空闲等待前,会认为当前线程处理空闲状态,于是就会调用那些已经注册了的IdleHandler接口,使得应用程序有机会在空闲的时候处理一些事情。
2、什么是handler
Handler通过发送和处理Message和Runnable对象来关联相对应线程的MessageQueue.
1)可以让对应的Message和Runnable在未来的某个时间点进行相应的处理
2)让自己想要处理的耗时操作放在子线程,让更新UI的操作放在主线程
3、handler的使用方法
1)post(runnable),本质还是通过sendMessage实现的
2)sendMessage(message)
4、handler机制的原理
03handler.JPG
5、handler引起的内存泄露以及解决方法
原因:非静态内部类持有外部类的匿名引用,导致外部activity无法释放
解决办法:
1)handler内部持有外部activity的弱引用
2)并把handler改为静态内部类
3)在Activity onDestory中执行mHandler.removeCallback()
网友评论