在项目的build.gradle文件添加:
dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'
}
在Application类添加:
public class ExampleApplication extends Application {
@Override public void onCreate() {
super.onCreate();
LeakCanary.install(this);
}
}
当在你的debug构建过程中出现内存泄露时,LeakCanary将会自动展示一个通知栏。
一. MainSplashActivity 内存泄漏
由于MainSplashActivity 继承了 BaseActivity;当启动MainSplashActivity时生命周期走到onstart()方法时,会调用BaseActivity的onStart()方法,它又调用了SoufunApp的mApp.returnForeGround(this)方法;把MainSplashActivity对象传入到SoufunApp中,SoufunApp会一直引用MainSplashActivity 对象
-----BaseActivity-----
@Override
protected void onStart() {
super.onStart();
mApp.returnForeGround(this);
}
由于SoufunApp在APP未销毁时是一直存在的, 通过scan = new ScanTimeDAO(activity); SoufunApp.scan会一直持有MainSplashActivity对象。
即使MainSplashActivity已经finish了,由于SoufunApp.scan还持有MainSplashActivity对象导致对象一直在内存中无法被回收。
-----SoufunApp-----
private ScanTimeDAO scan;
private boolean isFore;
public void returnForeGround(Activity activity) {
//-gly
if(!(activity instanceof MainSplashActivity)){
if (!isFore) {
scan = new ScanTimeDAO(activity);
scan.foreground();
isFore = true;
}
if (!isForeGround && isAppOnForeground()) {
// app 回到前台
scan.foreground();
isForeGround = true;
}
}
二.自定义浏览器leak TexToSpeech(android的一个能把文字读成语音的类)
网上错误:has leaked ServiceConnection android.speech.tts.TextToSpeech
解决方案:使用完tts之后,要通过复写Activity的onDestroy方法,关闭tts,否则会抛出泄漏.
@Override
protected void onDestroy() {
if(mTts != null) {
mTts.stop();
mTts.shutdown();
Log.d(TAG, "TTS Destroyed");
}
super.onDestroy();
}
可是我们的错误如上图,在整个项目中兵没有用到TTS(TextToSpeech),初步估计是android厂商的问题,暂时“无解”
三.静态对象导致内存泄漏
首先在JiaJuWokFlowActiviry定义了一个全局静态对象
public static Context mcontext;
在oncreate()方法里把当前JiaJuWokFlowActiviry的对象赋值给了mcontext
mcontext = this;
当JiaJuWokFlowActiviry界面finish后,mcontext一直还引用此对象,致使无法回收导致内存泄漏
四.