• Android中的FileObserver监听无效


    2020-02-27

    关键字:


    笔者遇到一个因 GC 而引发的监听无效的问题。

    今天遇到个需求:需要监听某个文件的状态。

    于是在网上找到答案,原来 Android 默认就提供了一个 android.os.FileObserver 的功能,可以监听文件系统中指定文件或文件夹的各种访问事件。

    关于 FileObserver 的使用,笔者主要参考了这两篇博客:

    https://www.jianshu.com/p/a509ad4311c0
    https://blog.csdn.net/Tony_YY/article/details/89688438

    但是,当笔者亲自写代码来验证的时候,却发现当受监听的文件的状态改变了以后,FileObserver 的 onEvent() 方法死活不会回调的问题。笔者加过各种打印,也更换过种种文件位置,均发现 FileObserver 无法监听。

    遍寻百度无果,万般无奈之下看了 android 官方关于 FileObserver 的文档:

    https://developer.android.google.cn/reference/android/os/FileObserver.html

    终于在文档中看到一句警告,如下图所示:

    这句警告大致的意思是:建议创建一个生命周期比较长的变量来存储你的 FileObserver 实例,否则有可能发生实例被 GC 回收的情况,一旦 FileObserver 实例被回收了,就无法监听了。

    醍醐灌顶!

    翻看一下笔者的代码,笔者当时贪方便,直接以下面的形式来启动文件监听:

      new HDMIWatcher().startWatching();

    这样创建出来的实例,显示有很大的几率被 GC 回收掉。

    于是改成用一个全局变量的储存实例引用的方式:

        watcher = new HDMIWatcher();
        watcher.startWatching();

    再次验证,发现问题已经没有了。

    还是官方文档好啊。


  • 相关阅读:
    不务正业系列-浅谈《过气堡垒》,一个RTS玩家的视角
    [LeetCode] 54. Spiral Matrix
    [LeetCode] 40. Combination Sum II
    138. Copy List with Random Pointer
    310. Minimum Height Trees
    4. Median of Two Sorted Arrays
    153. Find Minimum in Rotated Sorted Array
    33. Search in Rotated Sorted Array
    35. Search Insert Position
    278. First Bad Version
  • 原文地址:https://www.cnblogs.com/chorm590/p/12370952.html
Copyright © 2020-2023  润新知