- 应用 application.registerActivityLifecycleCallbacks(lifecycleCallbacks) 来监听全部生命周期内的 Activity>
对于开辟者而言,只须要应用到 LeakCanary.install(this); 这一句即可。那全部项目为什么要分成这么多个 module 呢?
实际上,这琅绫擎每一个 module 都有本身的角色。
- leakcanary-watcher : 这是一个通用的内存检测器,对外供给一个 RefWatcher#watch(Object watchedReference),可以看出,它不仅可以或许检测 Activity ,还能监测随便率性惯例的 Java Object 的泄漏情况。
- leakcanary-android : 这个 module 是与 Android 世界的接入点,用来专门监测 Activity 的泄漏情况,内部应用了 application#registerActivityLifecycleCallbacks 办法来监听>
- @Override public void execute(final Runnable command) { if (isOnMainThread()) {
- executeDelayedAfterIdleUnsafe(command);
- } else {
- mainHandler.post(new Runnable() { @Override public void run() {
- executeDelayedAfterIdleUnsafe(command);
- }
- });
- }
- }void executeDelayedAfterIdleUnsafe(final Runnable runnable) { // This needs to be called from the main thread.
- Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() { @Override public boolean queueIdle() {
- backgroundHandler.postDelayed(runnable, delayMillis); return false;
- }
- });
- }
什么是 IdleHandler ?我们知道 Looper 会赓续大年夜 MessageQueue 里掏出 Message 并履行。当没有新的 Message 履行时,Looper 进入 Idle 状况时,就会掏出 IdleHandler 来履行。
换句话说, IdleHandler 就是 优先级别较低的 Message ,只有当 Looper 没有消息要处理时才得到处理。并且,内部的 queueIdle() 办法若返回 true ,表示该义务一向存活,每次 Looper 进入 Idle 时就履行;反正,如不雅返回 false ,则表示只会履行一次,履行完后丢弃。
那么,这件优先级较低的义务是什么呢? backgroundHandler.postDelayed(runnable, delayMillis); ,runnable 就是之前 ensureGone() 。
也就是说,当主线程余暇了,没事做了,开端向后台线程发送一个延时消息,告诉后台线程,5s(delayMillis)后开端检查 Activity 是否被收受接收了。
所以,当 Activity 产生 destory 后,起重要比及主线程余暇,然后再延时 5s(delayMillis),才开端履行泄漏检查。
- void ensureGone(KeyedWeakReference reference, long watchStartNanoTime) {
- removeWeaklyReachableReferences(); if (gone(reference) || debuggerControl.isDebuggerAttached()) { return;
- }
- gcTrigger.runGc();
- removeWeaklyReachableReferences(); if (!gone(reference)) {
- File heapDumpFile = heapDumper.dumpHeap();
- heapdumpListener.analyze( new HeapDump(heapDumpFile, reference.key, reference.name, excludedRefs, watchDurationMs,
- gcDurationMs, heapDumpDurationMs));
- }
- }private boolean gone(KeyedWeakReference reference) {
推荐阅读
Linux 用户可能经常碰到的一个问题是,机械有 16GB 内存之多,运行的过程也不多,然则剩下的 free 内存并不多,大年夜部分都被 buff 和 cache 占用了(比如下面我的 PC)。$ free -h >>>详细阅读
本文标题:带你学开源项目:LeakCanary-如何检测 Activity 是否泄漏
地址:http://www.17bianji.com/lsqh/35385.html
1/2 1