zoukankan      html  css  js  c++  java
  • 利用 LeakCanary 来检查 Android 内存泄漏

    关于利用 LeakCanary 来检查 Android 内存泄漏

    源码:https://github.com/square/leakcanary

    第一步:添加依赖

    dependencies {
       debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
       releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
       testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
     }

    第二步:在application类中初始化LeakCanary

    import android.app.Application;
    import android.content.Context;
    import com.squareup.leakcanary.LeakCanary;
    import com.squareup.leakcanary.RefWatcher;
    
    /**
     * Created by Administrator on 2017/1/18.
     */
    
    public class MyApplication extends Application {
    
        /**
         * ActivityRefWatcher 来监控 Activity 泄漏。即当 Activity.onDestroy() 被调用之后,
         * 如果这个 Activity 没有被销毁,logcat 就会打印出如下信息告诉你内存泄漏发生了。
         * @param context
         * @return
         */
        public static RefWatcher getRefWatcher(Context context){
            MyApplication myApplication= (MyApplication) context.getApplicationContext();
            return myApplication.refWatcher;
        }
        private RefWatcher refWatcher;
            @Override
            public void onCreate() {
                super.onCreate();
                //初始化refWatcher
                refWatcher=LeakCanary.install(this);
            }
    }

    第三步:在AndroidManifest.xml使用上一步的application类

        <application
         //此处使用自定义的application类 android:name
    =".MyApplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".SecondActivity"></activity> </application>

    第四步:在activity中使用LeakCanary来监测内存泄漏情况,在onCreate()方法中初始化

    //<!-- LeakCanary -->
    //应用初始Activity中加入如下两行代码
    RefWatcher refWatcher = UILApplication.getRefWatcher(this);
    refWatcher.watch(this);
    //<!-- LeakCanary -->

      在Fragment中监控泄漏

    public abstract class BaseFragment extends Fragment {
    
        @Override 
        public void onDestroy() {
            super.onDestroy();
            RefWatcher refWatcher = ExampleApplication.getRefWatcher(getActivity());
            refWatcher.watch(this);
        }
    }

    OK,完成了,如果有内存泄露的话就会自动提示,上效果图。

    测试代码:静态变量引用非静态资源就很容易引起内存泄漏

    public class SecondActivity extends AppCompatActivity {
        static Demo sDemo;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_second);
            RefWatcher refWatcher=MyApplication.getRefWatcher(this);
            refWatcher.watch(this);
            if (sDemo == null) {
                sDemo = new Demo();
            }
            finish();
        }
    
        class Demo
        {
            void doSomething()
            {
                System.out.print("===============dosth.==========");
            }
        }
    }

    参考资料:

    http://blog.csdn.net/jie1991liu/article/details/49927865

    http://www.jianshu.com/p/0049e9b344b0

    http://blog.csdn.net/jie1991liu/article/details/49927865

  • 相关阅读:
    模拟+位运算 HDOJ 5491 The Next
    树状数组+二分||线段树 HDOJ 5493 Queue
    线段树(区间合并) HDOJ 3308 LCIS
    双端队列 HDOJ 3530 Subsequence
    BFS HDOJ 1242 Rescue
    Codeforces Round #321 (Div. 2)
    区间专题
    递推DP HDOJ 5459 Jesus Is Here
    补题列表2
    引用与指针的异同-基础篇
  • 原文地址:https://www.cnblogs.com/zhang-cb/p/6297079.html
Copyright © 2011-2022 走看看