android FileObserver的用法与避坑指南

昨天因为项目需要,需要做一个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的博客。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-19 04:43:21

android FileObserver的用法与避坑指南的相关文章

自如租房避坑指南

[自如租房避坑指南] 在北京工作了两年半的时间里,由于工作原因换了3次房,租的都是 自如的房子,选择自如的原因是因为自如省事,该有的东西都有.但是也有些比较坑的地方,这里列举一下,租房的时候需要注意,这样能让你租到一个比较顺心的房子. 不要完全相信自如APP上面标的房屋面积 在我租房的过程中我看过一些自如的房子,发现自如有些房屋的面积是虚标的,有些标示8平米的房子实际可能只有6平米,有时间最好还是实地去看一下,感觉面积合适再租 价格特别便宜的要注意(相对该房子周边来说) 有时候你在自如上看到特别

安装Seafile Server 7.1.3 不完全避坑指南

容易踩的坑 解决依赖关系是安装seafile server的第一个坑. 官方提供的安装包,大部分依赖都已经打包在包里了, 只有seahub依赖的部分Python包,因为使用了C语言,编译安装时必须和Python的版本对应(这也是之前Windows版本必须安装指定版本python的原因),由于无法预知客户端的Python版本,所以无法包含在安装包中. MySQL/Mariadb数据库配置是第二个坑. 有些系统安装的MySQL/Mariadb数据库,默认配置是不允许root用户通过网络连接服务器的,

跳槽找工作避坑指南(2019版)

虽说年前就有很多人在修改简历.刷新简历,但是为了大家心中所谓的年终奖,99.9999%的人都会选择沉默,有一种「明修栈道,暗度陈仓」意味. 拿完了年终奖,过完了春节,老子早TMD的不想干了,终于不用在你「对象是种扣嗖的老板或领导」这里受你这等鸟气了.于是乎,吭哧吭哧的埋头苦写简历,狂撒网,做梦都想有朝一日能出任CEO,迎娶白富美,走上人生的巅峰. 理想是丰满的,现实是残酷的,搞不好,美梦没有做完,就会吃上一记当头一棒,将你打入「绝情谷」谷底.所以,跳槽找工作一定要慎重,慎重,再慎重. 之前也写过

微信小程序避坑指南

如果对小程序还不熟悉,建议先看下另一篇小程序简介 1. 基础库和微信版本对应关系 iOS 客户端版本 基础库版本 6.7.2 2.3.0 6.7.0 2.2.5 6.6.7 2.1.3 6.6.6 2.0.9 6.6.2 1.9.97 6.6.1 1.9.9 6.6.0 1.9.4 6.5.22 1.7.4 6.5.16 1.6.8 6.5.13 1.5.8 6.5.10 1.4.4 6.5.9 1.3.0 6.5.8 1.2.6 Android 客户端版本 基础库版本 6.7.2 2.3.0

Android工程导入Unity3D(避坑版)

最近与各种牛逼的项目管理软件打交道,比如SourceTree,要看英文版的才看得懂,中文反而不会用!... 这篇博客适合没怎么接触过安卓的小伙伴们,网上也有很多相关的教程,但是大多都没有具体的操作或则操作不全.安卓知识欠缺的小伙伴很容易迷失方向. 首先,从新建一个安卓工程开始,我用的是Eclipse File------>new file------>Android Application Project. 弹出以上页面,注意红色的划线了,最小的SDK选4.0以上,为什么呢? 因为如果选4.0

博客园写作避坑指南【持续更新】

以下是花了一晚上调格式之后的血泪经验,如果之后有新的发现会持续更新-- 关于英文单词自动断行 如果你和我一样需要写英文博文,你会发现遇到行尾的英文单词全部被拦腰截断,看上去怪怪的. 这是因为博客园默认模板CSS将mainContent设置为word-break:break-all,即强制断行. 好在博客园开放了页面定制CSS代码,我们可以很方便地加入自己的设置来覆盖掉默认设置,只需要在"设置 -> 页面定制CSS代码"中加入以下代码: #mainContent { word-br

微服务架构下领域建模避坑指南

前言 微服务自2014年3月由Martin Fowler首次提出以来,在Spring Cloud.Dubbo等各类微服务框架的帮助下,以燎原之势席卷了整个IT技术界,成为了最主流的分布式应用解决方案.伴随着Service Mesh及Kubernetes(K8S)的出现更是将微服务架构推至顶峰. 微服务架构(Microservice Architecture)是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦,并提供更加灵活的服务支持. 经常有人在讨论:架构是设计出来的?还

Windows 下安装 tensorflow &amp; keras &amp; opencv 的避坑指南!

安装 Anaconda3 关键的一步: conda install pip 下面再去安装各种你需要的包,一般不会再报错. pip install tensorflow-gpu ==1.5.0rc1 pip install -U keras 如果需要安装 theano,则需要先安装它的依赖包,即 conda install mingw libpython pip install -U theano 安装 OpenCV3 (Windows环境): pip install -U opencv-cont

python避坑指南02——logging模块日志重复打印问题

目录 [TOC] 一.问题抛出 python的logging模块是python使用过程中打印日志的利器.我们可以使用logging模块的logger.Handler.formatter对我们的日志进行封装,指定日志输出的路径.格式以及位置.在声明logger的时候可以传一个字符串作为这个logger的标签.一直以为这个logger是以单例对象的设计模式设计的,只要这个标签名是一样的,那么返回的logger就是同一个.在打印日志的时候,想要实现日志分层,定义类如下函数来封装日志打印函数(由于源代码