关于Android内存泄露的一个理解误区

284 阅读1分钟

很多常见现象比如单例实例、静态变量、cursor、stream未关闭等引起的内存泄露我不再赘述,网上一搜一大把。 但是,如非静态内部类引起的内存泄露我发现很多文章解释地不准确,在此我说一下正确的理解。

很多文章都说非静态内部类对外部类有一个隐式引用,所以会导致内存泄露,其实这个解释不准确,因为正常情况下,非静态内部类实例确实和外部类有相互引用,但是当回收内存,比如回收activity时候,如果没有其他对象引用内、外部类实例,非静态内部类实例会和外部类实例作为一个整体被回收,不会造成内存泄露。

我们常用的handler可能会导致内存泄露,是因为在回收activity时候,handler的消息队列里面有未处理的message,而这些message对handler有引用,而handler对activity有引用,这样一条引用链就形成,导致activity泄露。如果将handler设置为静态内部类,这样就不会对activity有引用,一般情况下可以规避泄露,但如果message中的内容有直接指向activity,还是可能导致activity泄露,所以最简单的方法就是在销毁activity时候清除handler中的消息。。。