作家
登录

带你学开源项目:LeakCanary-如何检测 Activity 是否泄漏

作者: 来源: 2017-05-24 10:06:09 阅读 我要评论

  1. public static void installOnIcsPlus(Application application, RefWatcher refWatcher) { 
  2.     ActivityRefWatcher activityRefWatcher = new ActivityRefWatcher(application, refWatcher); 
  3.     activityRefWatcher.watchActivities(); 
  4.  

创建了一个 ActivityRefWatcher ,大年夜家应当能感触感染到,这个器械就是用来监控我们的 Activity 泄漏状况的,它调用 watchActivities() 办法,就可以开端进行监控了。下面就是它监控的核心道理:

  1. public void watchActivities() { 
  2.   application.registerActivityLifecycleCallbacks(lifecycleCallbacks); 
  3.  

它向 application 里注册了一个 ActivitylifecycleCallbacks 的回调函数,可以用来监听 Application 全部生命周期所有 Activity 的 lifecycle 事宜。再看下这个 lifecycleCallbacks 是什么?

  1. private final Application.ActivityLifecycleCallbacks lifecycleCallbacks =    new Application.ActivityLifecycleCallbacks() {      @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { 
  2.       }      @Override public void onActivityStarted(Activity activity) { 
  3.       }      @Override public void onActivityResumed(Activity activity) { 
  4.       }      @Override public void onActivityPaused(Activity activity) { 
  5.       }      @Override public void onActivityStopped(Activity activity) { 
  6.       }      @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { 
  7.       }      @Override public void onActivityDestroyed(Activity activity) { 
  8.         ActivityRefWatcher.this.onActivityDestroyed(activity); 
  9.       } 
  10.     }; 

本来它只监听了所有 Activity 的>

  • void onActivityDestroyed(Activity activity) { 
  •   refWatcher.watch(activity); 
  • RefWatcher refWatcher = androidWatcher(application, heapDumpListener, excludedRefs);  
  • 可以看出,这个函数把目标 activity 对象传给了 RefWatcher ,让它去监控这个 activity 是否被正常收受接收了,若未被收受接收,则意味着产生了内存泄漏。

    RefWatcher 若何监控 activity 是否被正常收受接收呢?

    我们先来看看这个 RefWatcher 毕竟是个什么器械?

    1. public static RefWatcher androidWatcher(Context context, HeapDump.Listener heapDumpListener, 
    2.     ExcludedRefs excludedRefs) { 
    3.   AndroidHeapDumper heapDumper = new AndroidHeapDumper(context, leakDirectoryProvider); 
    4.   heapDumper.cleanup();  int watchDelayMillis = 5000; 
    5.   AndroidWatchExecutor executor = new AndroidWatchExecutor(watchDelayMillis);  

        推荐阅读

        一个可以查看Linux当前缓存了哪些大文件的小工具

      Linux 用户可能经常碰到的一个问题是,机械有 16GB 内存之多,运行的过程也不多,然则剩下的 free 内存并不多,大年夜部分都被 buff 和 cache 占用了(比如下面我的 PC)。$ free -h >>>详细阅读


      本文标题:带你学开源项目:LeakCanary-如何检测 Activity 是否泄漏

      地址:http://www.17bianji.com/lsqh/35385.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)