handlerthread会泄漏吗
的有关信息介绍如下:你好,handlerthread是会泄漏的
什么是java的内存泄漏
Java内存泄漏指的是进程中某些对象已经没有使用价值并且想将其释放回收掉,但是它们却可以直接或间接地被其他对象强引用,导致无法被GC回收。无用的对象占据着内存空间,使得实际可使用内存变小,形象地说法就是内存泄漏。
为什么我们上面的代码会产生内存泄漏
1、在程序启动的时候就在主线程中创建了一个Looper 对象,它内部维护着一个消息队列,并且一条一条的对消息进行处理。
2、当我们发送消息的时候,在Message的target里面存放着发送该消息的handler对象,即消息里面包含了一个Handler实例的引用,并且就是通过这个handler实例来回调handleMessage方法进行处理。
如果对上面两点不明白的话,可以看看Looper与Handler解析
3、在Java中,非静态的内部类和匿名内部类都会隐式地持有其外部类的引用。静态的内部类不会持有外部类的引用。
理解了上面的三点,应该就差不多清楚了为什么上面的代码会出现内存泄漏。
如何解决这个问题?
也很简单,上面说到要避免使用非静态的内部类,那我们就使用静态的内部类,或者把内部类单独写个文件,让它成为一个单独的类。另外,我们可以在里面增加一个成员变量来弱引用外部类实例,就可以调用外部类的方法。
第一种改进方法:使用静态内部类
第二种改进方法:单独定义一个类
希望对你有帮助