android FileObserver的用法与避坑指南

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/J_bing/article/details/47146953

昨天因为项目需要,需要做一个damo,用到了文件监听的功能,所以就使用了FileObserver(文件观察器)这个类,结果就被坑的不行不行的,昨天下班已经身心俱疲,本着跟bug呲牙必报的精神,这里要将这笔账记下,也希望大家以后不会在这上面浪费时间。

FileObserver的功能

故名思议,就是监听文件的事件啦,根据官方给出的文档,有以下几种事件的响应,对应不同的事件常量。

常量名 对应事件
ACCESS 打开文件后读取文件的操作
ALL_EVENTS 事件列表中的所有事件
ATTRIB 未明操作
CLOSE_NOWRITE 只读文件被关闭
CLOSE_WRITE 读写文件被编辑并关闭
CREATE 文件被创建创建
DELETE 文件被删除
DELETE_SELF 自删除事件
MODIFY 文件被修改
MOVED_FROM 移出事件
MOVED_TO 移入事件
MOVE_SELF 自移动事件
OPEN 文件被打开

这些常量都是在FileObserver类里面的,因此可以通过FileObserver.XXX来调用。

FileObserver可以监听两种类型的文件:一种是单个文件,另一种是文件目录。需要注意的是监听文件目录的时候有个不能递归子目录的问题,因此要么确保监听的文件下没有子目录,要么做特殊的操作,手动递归监听每一个子目录。

FileObserver的用法

1.FileObserver是一个抽象类,使用的时候我们需要自己实现一个类来继承FileObserver。

2.编写构造方法

构造方法有两种写法:

第一种是只传路径参数
public FileObserver (String path)

其实使用这种方法的时候,为了防止发生嵌套调用产生死循环,我们可以在实现方法的时候进行一点优化。

public FileObserver (String path) {
    super( path, FileObserver.CREATE | FileObserver.DELETE );
}

可以看到,我们继承super方法的时候,调用了父类的另外一种构造参数,在第二个参数中,将我们需要监听的事件传了进去,这样就可以保证过滤掉不需要的事件,降低发生死循环的概率。

第二种传路径和需要监听的事件
public FileObserver (String path, int mask)

在第一种方法的优化中我们已经看到了这种方法的用法,使用中也可以使用这种方法来进行构造,相对于第一种方法,这种方法耦合性更低一些。

3.实现onEvent(int event, String path)方法

前面说了,FileObserver是一个抽象类,这个onEvent方法就是它的抽象方法,需要在子类中进行实现。

@Override
public void onEvent(int event, String path) {
    /*event的值是与0x40000000进行或运算后的值,所以在case之前需要先和FileObserver.ALL_EVENTS进行与运算*/
    int e = event & FileObserver.ALL_EVENTS;

    switch (e) {
        case FileObserver.CREATE:
            /*do something*/
            break;
    }
}

4.开启与关闭监听

在FileObserver中提供了开启和关闭监听的方法,只需要直接调用就可以了。

startWatching();  //开启监听

stopWatching();  //结束监听

需要注意的一点是作为监听者的FileObserver需要一直保持一个引用来防止被java的GC机制干掉,所以最好和一个持久性引用绑定工作,一般我们都使用Service来进行绑定使用。

5.权限问题

网上所有关于使用FileObserver的教程都没提及权限的申请,但我昨天使用中就是因为权限的问题导致一直监听不到。而且FileObserver用到的权限没申请的时候不是常规的报错提示,只是默默地罢工了,个人认为是在是最大的坑。

在清单文件中加入以下权限:

<!--往sdcard中写入数据的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!--在sdcard中创建/删除文件的权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>

建议是在遇到如何都监听不到的时候再加权限,毕竟权限申请太多有的用户很反感的。

总结

通过上面的介绍可以看到,FileObserver的坑真的是超多,真是滩险石多,需要耐心和谨慎来尽量避免。

引用声明

Android文件或文件夹内容改变监听器(FileObserver)——mayingcai1987的博客。

展开阅读全文

没有更多推荐了,返回首页