FileObserver修改不起作用



这是我的代码:

public class SyncNotifyService extends Service {
    private final static String TAG = "FileService";
    SDCardListener fileObserver = null;

@Override
public IBinder onBind(Intent intent) {
    return null;
}
public File getCacheDir() {
    if (!StorageUtil.isExternalStorageAvailable()) {
        return null;
    }
    File dir = new File(Environment.getExternalStorageDirectory(), "Cache");
    return dir;
}
@Override
public void onCreate() {
    super.onCreate();
    Log.d(TAG, "onCreate");
    fileObserver = new SDCardListener(FileCache.getCacheDir().getPath(), FileObserver.MODIFY);
    fileObserver.startWatching();
}
class SDCardListener extends FileObserver {
    public SDCardListener(String path, int mask) {
        super(path, mask);
    }
    @Override
    public void onEvent(int event, String path) {
        final int action = event & FileObserver.ALL_EVENTS;
        switch (action) {
        case FileObserver.MODIFY:
            Log.d(TAG, "event: MODIFY");
            break;
        }
    }
}

}

嗨,我用这段代码通知一个目录。但我发现它从来没有调用onEvent使用FileObserver。修改参数,谁知道怎么写正确的代码?我的android版本是4.1.1

也许你写onEvent的方式不合适,使用

if (!event.equals(MODIFY)) { return;} 
//the code you want 
if (path.equals(blah blah blah)) {
//some code.. 
}

这是我在FileObserver中使用的方式,试试吧…

当您创建FileObserver时,路径应该是包含您正在观察的文件的目录的绝对路径:

fileObserver = new SDCardListener(FileCache.getCacheDir().getAbsolutePath(), FileObserver.MODIFY);

同样,修改这个:

 public void onEvent(int event, String path) {
    switch (action) {
    case FileObserver.MODIFY:
        Log.d(TAG, "event: MODIFY");
        break;
    }
}

如果onEvent没有被触发,试着改变你初始化FileObserver的方式,让它监听ALL_EVENTS并打印被触发的事件。然后您可以找出为什么MODIFY不是触发器。

FileObserver 根本不是递归的!

检查:

https://code.google.com/p/android/issues/detail?id=33659

我建议使用RecursiveFileObserver类:

https://github.com/owncloud/android/blob/master/src/com/owncloud/android/utils/RecursiveFileObserver.java

最新更新