android handle looper 使用误区

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)