前言
Android内存泄漏的分析与解决是每个Android程序员进阶路上的必备技能。今天就和大家分享一下我的一点点学习心得。
开始使用
首先在module的build.gradle添加依赖,不同的版本需要添加不同的依赖
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.3.0' compile 'com.android.support:design:23.3.0' debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4-beta2' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2' testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2' }
这个时候我们Sync Project可能会遇到
Error:(26, 20) Failed to resolve: com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2
提示我们依赖不存在,这个时候我们需要在project的build.gradle添加如下代码
allprojects { repositories { jcenter() } }
这是我们Sync就一切OK啦~~~
如果还是不行,推荐另外一种答案 https://github.com/square/leakcanary/issues/117
如何使用
首先我们要定义自己的Application,并在Application的onCreate方法中,对LeakCanary进行初始化。
BaseApplication.java
public class BaseApplication extends Application { public static RefWatcher getRefWatcher(Context context){ BaseApplication baseApplication = (BaseApplication) context.getApplicationContext(); return baseApplication.mRefWatcher; } private RefWatcher mRefWatcher; @Override public void onCreate() { super.onCreate(); mRefWatcher = LeakCanary.install(this); } }
我们需要在AndroidManifest文件中对Application进行配置
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.jianma.mdapp"> <application android:name="com.example.jianma.mdapp.base.BaseApplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".activity.MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name=".activity.DetailActivity"> </activity> </application> </manifest>
我们在Activity的onDestroy方法中调用
BaseApplication.getRefWatcher(this).watch(this);
这个时候LeakCanary就会帮助我们进行内存泄漏的检查,并在通知栏给予我们提示。
我们利用了Handler的内存泄漏进行演示。
首先我们在Activity中定义了Handler对象
final Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); Log.e("eee", "message"); } };
然后我们在点击按钮的时候延迟30秒发送消息
handler.sendEmptyMessageDelayed(0, 30000);
这时候我们点击返回按钮,activity并没有被内存回收,因为handler对象还持有对activity的引用。LeakCanary就会给我们提示。
我们就可以进行分析啦,很大程度上帮我们发现并解决内存泄漏的问题~~
查看更多关于【Android开发】的文章