Android帝国的崩塌—垃圾之城(危险人物)

非静态内部类也是危险分子

由于非静态内部类可以直接访问其外部类的字段,而无需引用,这种方式深受Android建筑师和工程师的喜欢。所以在许多工程中被广泛使用。但是我们没有看到使用非静态内部类隐患。

我们分析一下,看一看这样的隐患是如何产生的。我们在 Activity 创建阶段,实例化了一个内部类 MyAsyncTask。那么 MyAsyncTask 在其整个生命周期内,都应该能够访问其外部类 Activity ,也就是持有该 Activity 的引用。当遇到执行 Activity.finish() 或有些旋转屏幕的方向或是内存紧张而 kill 这个 Activity 。这个时候 Activity 应该被垃圾回收,但是由于内部类没有执行完毕,而导致 Activity 没有被垃圾回收,而是长驻内存。这样也就是发生了内存泄露。

解决方案我们将内部类修改为静态内部类,那么如何解决内部静态类无法使用外部类的资源,那么我们就需要提供一个外部类的引用供内部类使用。这样两个类就独立了。大家注意到这里我是使用了弱引用方式来引用 Activity。

单例

单例就是类在整个应用的生命周期只能被实例化一次,好处多多,避免重复创建,共享数据。他的优点也就是他弱点,因为他生命周期的特殊性,我们需要对他所引用的类给予重视。如果他引用一个 Activity 那么同样问题就是该 Activity 是无法在不被使用时正常地被垃圾回收的。看一例吧,帮助您理解。

解决方案有两中,您可以根据个人喜好选择

我们在 Activity 不再使用时,将其引用设置 null,这样 Activity 就可以正常地被垃圾回收了。

2. 方法我们就是在源头解决这个问题,将引用修改为弱引用。

匿名内部类

如果我们不用 Activity 去实现 Singleton 的 Callback 接口,而是使用匿名内部类来实现接口,这样做同样存在内存泄露的问题,解决方案同上。

你可能感兴趣的:(Android帝国的崩塌—垃圾之城(危险人物))