FileObserver递归监听目录(解决无法监听目录的创建、删除问题)
主要内容
为了解决Android媒体数据库更新不及时的问题,我想打算通过FileObserver监听SD卡根目录下所有文件的变化,然后根据文件的变化对Android媒体数据库进行更新。而FileObserver无法做到递归监听。通过参考FileObserver 研究及其递归监听初步实现这篇博客,在其基础上,主要解决了几个问题:
- 无法监听目录的创建、删除
- 开启监听之后,新创建的目录无法监听
- 冗余注册监听的问题
冗余注册监听我是通过用ArrayMap键值对来解决的,以监听目录的绝对路径作为key,以监听器作为value。(也可以使用ArraySet集合实现)而开启监听之后,新创建的目录无法监听的问题则是通过监听FileObserver.CREATE事件,当创建新目录且该目录还没注册监听时,就注册并启动监听。
接下来,干货来了,代码如下:
public class RecursiveFileObserver extends FileObserver
{
Map<String, SingleFileObserver> mObservers;
String mPath;
int mMask;
public RecursiveFileObserver(String path)
{
this(path, ALL_EVENTS);
}
public RecursiveFileObserver(String path, int mask)
{
super(path, mask);
mPath = path;
mMask = mask;
}
@Override public void startWatching()
{
if (mObservers != null)
return ;
mObservers = new ArrayMap<>();