添加依赖:
佳姝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官网上查看,希望大家多多支持,鼓励。。