android handle looper 使用误区
16lz
2021-01-23
adt2.0的开发者们可能会在handler上发现这么一条警告:This Handler class should be static or leaks might occur 。
首先在ADT 20 Changes我们可以找到这样一个变化:New Lint Checks:
Look for handler leaks: This check makes sure that a handler inner class does not hold an implicit reference to its outer class.
翻译过来就是,Lint会增加一个检查项目即:确保class内部的handler不含有外部类的隐式引用 。
同一个线程下的handler共享一个looper对象,消息中保留了对handler的引用,只要有消息在队列中,那么handler便无法被回收,如果handler不是static那么使用Handler的Service和Activity就也无法被回收。这就可能导致内存泄露。当然这通常不会发生,除非你发送了一个延时很长的消息。
官方推荐 将 handler 设为static 成文单太类
在里面 使用 弱引用 WeakReference
WeakReference则类似于可有可无的东西。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存,说白了就是一个没那么strong要求垃圾回收器将一个对象保留在内存中。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。
在线程中直接调用
Loop.prepare();
toast.show();
Loop.loop();
在分线程弹出Toast之前把Looper准备好,实验表明,这样确实可以达到效果。可以把Toast弹出来。
但是这样有个问题,就是会导致分线程永远不会退出。这个原理大家看看Looper.loop()是怎么实现的就知道了,它里面是一个死循环。
这样的话,会导致进程里面的线程越来越多
更多相关文章
- android获取进程信息,运行内存信息
- Android 一个下载任务分为多个线程下载
- Android 多线程1
- Python获取android设备cpu和内存占用情况
- android 之json对象解析并展示(含json解析源码)
- Android 处理多线程 UserTask