zoukankan      html  css  js  c++  java
  • 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();

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

    还是官方文档好啊。


  • 相关阅读:
    目前流行的缺陷管理工具
    高性能WEB开发之Web性能测试工具推荐
    测试工具
    简单的事件示例代码
    C#常用代码片段备忘
    C# 获取变量或对象的栈与堆地址
    C#常用的命名规则汇总
    C# 成员默认访问权限(public、private、protected、internal)
    C# 学习路线
    简单的异常例子
  • 原文地址:https://www.cnblogs.com/chorm590/p/12370952.html
Copyright © 2011-2022 走看看