使用LeakCanary解决Handler和AsnycTask的OOM

添加依赖:

佳姝1:在项目的build.gradle中添加以下依赖

   debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.1'
    releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.1'
    // Optional, if you use support library fragments:
    debugImplementation 'com.squareup.leakcanary:leakcanary-support-fragment:1.6.1'

佳姝2:自定义MyApp类继承Application,注意记得在manifests清单文件中的application{

android:name=".App"

}

声明此类

public RefWatcher refWatcher;
@Override public void onCreate() {
    super.onCreate();
    refWatcher = setupLeakCanary();
}

private RefWatcher setupLeakCanary() {
    if (LeakCanary.isInAnalyzerProcess(this)) {
        return RefWatcher.DISABLED;
    }
    return LeakCanary.install(this);
}

public RefWatcher getRefWatcher() {
    return refWatcher;
}

 佳姝3:MainActivity中 使用static+弱引用解决OOM:

package com.example.ncxl_paydemo;

import android.app.Application;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

import com.squareup.leakcanary.RefWatcher;

import java.lang.ref.WeakReference;

public class MainActivity extends AppCompatActivity {

    private Handler handler=new MyHandler(MainActivity.this);
    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        load();
    }

    private void load() {
        handler.sendMessageDelayed(Message.obtain(),10000);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
      //注意:如果注释掉此removeCallbacksAndMessages()方法将会报内存泄漏,图片在下方显示
        handler.removeCallbacksAndMessages(null);

        App application = (App)getApplication();
        RefWatcher refWatcher = application.getRefWatcher();
        refWatcher.watch(this);
    }

    //解决Handler的OOM,如果开启了子线程都需在onDestory关闭,因此不会泄露
    static class MyHandler extends Handler{
        //软引用,自动回收
        private WeakReference<MainActivity>mWeakReference;

        public MyHandler(MainActivity mainActivity) {
            mWeakReference=new WeakReference<>(mainActivity);
        }
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (mWeakReference.get() != null){
                mWeakReference.get().tv.setText("我喜欢看帅哥,因为养眼");
            }
        }
    }
  //重新开启了一个新线程会泄漏
     /*class MyHandler extends Handler{

        MainActivity act ;
        public MyHandler(MainActivity mainActivity) {
            act = mainActivity;
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (act != null){
                act.mTv.setText("我喜欢敲代码");
            }
        }
    }*/
    private void initView() {
        tv = (TextView) findViewById(R.id.tv);
    }
}

 注意:开始运行项目时,一定不要让他运行完在半路时让他退出此程序,就能看到下图中的内容并且了解:知道是哪里内存泄漏了。

大家都知道内存泄漏项目不会崩(泄漏少的情况下),而内存溢出会崩,为了更有效的找到哪行报错,所以有了可以直接导入依赖就可以使用的一种工具LeakCanary,完整的使用大家也可以去GitHup官网上查看,希望大家多多支持,鼓励。。

猜你喜欢

转载自blog.csdn.net/Lj_18210158431/article/details/81567183