美文网首页
使用LeakCanary解决项目内存泄漏

使用LeakCanary解决项目内存泄漏

作者: 一凡和梓墨 | 来源:发表于2016-12-01 19:23 被阅读1574次

    在项目的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 内存泄漏


    355804492593131668.jpg

    由于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的一个能把文字读成语音的类)


    731177381867283589.jpg

    网上错误: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厂商的问题,暂时“无解”

    三.静态对象导致内存泄漏


    537558188572859654.jpg

    首先在JiaJuWokFlowActiviry定义了一个全局静态对象
    public static Context mcontext;
    在oncreate()方法里把当前JiaJuWokFlowActiviry的对象赋值给了mcontext
    mcontext = this;
    当JiaJuWokFlowActiviry界面finish后,mcontext一直还引用此对象,致使无法回收导致内存泄漏

    四.


    742651300587760291.jpg
    370179125087539110.jpg

    相关文章

      网友评论

          本文标题:使用LeakCanary解决项目内存泄漏

          本文链接:https://www.haomeiwen.com/subject/fvrxmttx.html