温馨提示:这篇文章已超过472天没有更新,请注意相关的内容是否还可用!
摘要:本文补充介绍了Android的Handler机制。Handler是Android开发中常用的工具,用于处理异步任务和延迟任务。它通过消息队列管理任务执行顺序,确保程序流畅运行。Handler机制包括消息类型、消息队列、回调方法等关键部分。正确使用Handler可以提高应用程序的性能和响应速度,是Android开发中不可或缺的一部分。
当APP启动时,会启动ActivityThread
类中的main
方法,这个方法的主要作用是进行消息循环,一旦消息循环停止,APP程序就会退出,Android是事件驱动的,在Looper.loop()
中不断接收、处理事件。ActivityThread
是一个final类,其生命周期都由主线程的Looper
来调度,主线程Looper的存活周期和App的生命周期基本一致。
当没有事件需要处理时,主线程会阻塞;当子线程向消息队列发送消息时,主线程就会被唤醒,从代码层面来看,主线程的Looper
和其他线程的Looper
在机制上是相似的,但主线程的Looper
已经完成了初始化和循环操作。
因为我们的代码是通过Handler驱动的,包括Activity的生命周期方法和UI绘制事件,这些都被封装成一个个的Message,然后通过Looper来触发,如果某个消息执行时间过长,可能会影响UI线程的刷新效率,造成卡顿现象。
2、关于Looper.loop无限循环是否阻塞主线程
是的,Looper的无限循环确实会阻塞主线程,但这并不是问题,Looper的循环机制是不断从MessageQueue中取出Message并执行,当主线程的MessageQueue中没有消息时,主线程会阻塞在queue.next()
中的nativePollOnce
方法,这个方法通过调用Linux的epoll机制来等待下一个事件的发生,在这个过程中,主线程会进入休眠状态并释放CPU资源。
关于threadLocal与Activity内存泄漏的问题
ThreadLocal是静态的,它持有对Looper、MessageQueue等的引用,而这些对象又持有对Activity的引用,形成了一个强引用链,由于这个链的存在,导致了Activity无法被正常回收,从而可能引发内存泄漏,对于这种问题,可以通过使用软引用结合静态引用的方式来解决。
是对Handler启动和Looper.loop无限循环的一些解释和补充,关于内部类导致的内存泄漏问题,除了ThreadLocal持有的内部类外,其他内部类如果没有被其他类持有,则不会引发此问题,对于解决内存泄漏的问题,除了上述的软引用结合静态引用的方法外,还可以考虑使用其他技术如自动解绑、使用弱引用等,希望这些解释和补充能对您有所帮助。
还没有评论,来说两句吧...