欢迎访问自动发外链网站,大量seo自动发布外链工具与案例

[八种常用的外链建设方法]Android防止内存泄漏的八种方法(下)

作者:jcmp      发布时间:2021-04-28      浏览量:0
转载至: http://www

转载至: http://www.jianshu.com/p/c5ac51d804fa。

1、原文地址。

在上一篇 Android内存泄漏的八种可能(上) 中,我们讨论了八种容易发生内存泄漏的代码。其中,尤其严重的是泄漏Activity对象,因为它占用了大量系统内存。不管内存泄漏的代码表现形式如何,其核心问题在于:

在Activity生命周期之外仍持有其引用。

幸运的是,一旦泄漏发生且被定位到了,修复方法是相当简单的。

2、Static Actitivities

3、这种泄漏

privatestaticMainActivity activity;voidsetStaticActivity(){ activity =this;}

构造静态变量持有Activity对象很容易造成内存泄漏,因为静态变量是全局存在的,所以当MainActivity生命周期结束时,引用仍被持有。这种写法开发者是有理由来使用的,所以我们需要正确的释放引用让垃圾回收机制在它被销毁的同时将其回收。

Android提供了特殊的Set集合 https://developer.android.com/reference/java/lang/ref/package-summary.html#classes。

允许开发者控制引用的“强度”。Activity对象泄漏是由于需要被销毁时,仍然被强引用着,只要强引用存在就无法被回收。

4、可以用弱引用代替强引用。

https://developer.android.com/reference/java/lang/ref/WeakReference.html .

弱引用不会阻止对象的内存释放,所以即使有弱引用的存在,该对象也可以被回收。

privatestaticWeakReference activityReference;voidsetStaticActivity(){ activityReference =newWeakReference(this); }

5、Static Views

6、静态变量持有View

privatestaticView view;voidsetStaticView(){ view = findViewById(R.id.sv_button);}

由于View持有其宿主Activity的引用,导致的问题与Activity一样严重。弱引用是个有效的解决方法,然而还有另一种方法是在生命周期结束时清除引用,Activity#onDestory()方法就很适合把引用置空。

privatestaticView view;@OverridepublicvoidonDestroy(){super.onDestroy();if(view !=null) { unsetStaticView(); }}voidunsetStaticView(){ view =null;}

7、Inner Class

8、这种泄漏

privatestaticObject inner;voidcreateInnerClass(){classInnerClass{ } inner =newInnerClass();}

与上述两种情况相似,开发者必须注意 少 用非静态内部类,因为 非静态内部类 持有外部类的隐式引用,容易导致意料之外的泄漏。然而内部类可以访问外部类的私有变量,只要我们注意引用的生命周期,就可以避免意外的发生。

9、避免静态变量

10、这样持有内部类的成员变量是可以的。

privateObject inner;voidcreateInnerClass(){classInnerClass{ } inner =newInnerClass();}

11、Anonymous Classes

前面我们看到的都是持有全局生命周期的静态成员变量引起的,直接或间接通过链式引用Activity导致的泄漏。这次我们用AsyncTask。

voidstartAsyncTask() {newAsyncTask() { @OverrideprotectedVoiddoInBackground(Void...params) {while(true); } }.execute();}

12、Handler

voidcreateHandler(){newHandler() {@OverridepublicvoidhandleMessage(Message message){super.handleMessage(message); } }.postDelayed(newRunnable() {@Overridepublicvoidrun(){while(true); } }, Long.MAX_VALUE >>1);}

13、Thread

voids