使用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官网上查看,希望大家多多支持,鼓励。。