FileObserver - > onEvent(event,path):path为NULL

时间:2013-02-19 08:49:21

标签: android fileobserver

我想知道文件写完的时间,为此我尝试使用FileObserver。我是这样做的:

FileObserver observer = new FileObserver(imageUri.getPath()) {
        @Override
        public void onEvent(int event, String path) {
            if(event == FileObserver.CLOSE_WRITE)
                Log.d(TAG, "FILE: "+path);
        }
};
observer.startWatching();

imageUri是有效的Uri。当文件关闭时,我得到以下日志条目:

FILE: null

为什么null?用户可能会写入多个文件,因此我需要知道哪个文件正在触发事件。

谢谢!

2 个答案:

答案 0 :(得分:6)

根据documentation of onEvent()

  

触发事件的文件或目录相对于主受监视文件或目录的路径

所以我猜当pathnull时,它是指定的文件或目录......

您需要自己跟踪原始路径。并将path onEvent()附加到此路径以获取完整路径(除非您正在跟踪文件且其值始终为null):

FileObserver observer = new FileObserver(imageUri.getPath()) {
    public String basePath;

    @Override
    public void onEvent(int event, String path) {
        String fullPath = basePath;
        if(path != null) {
            // Eventually add a '/' in between (depending on basePath)
            fullPath += path;
        }
        Log.d(TAG, "FILE: "+fullPath);
    }
};
observer.basePath = imageUri.getPath();
observer.startWatching();

我尽量让示例尽可能靠近您的代码段。但是,创建一个扩展FileObserver的完整类更好,所以你可以添加一个构造函数来存储basePath,并且不需要从类/实例外部访问公共字段!

答案 1 :(得分:4)

我今天刚遇到这样的事情。我有一个FileObserver监视新文件的文件夹,然后我试图用下载的图像做一些事情。当我通过BitmapFactory.decodeFile(ImgPath)访问图像时,我有时会得到一个NULL结果。这似乎发生在更新更快的设备上,并且在步进事件时从不进行调试。我得出的结论是该文件仍在使用中或尚未完全完成,我不得不等到系统从文件中释放出它的爪子。

我是Android开发的新手,并不熟悉正确的方法,但是通过插入Thread.sleep来避免暂时出现NULL问题。我知道这很糟糕,但它对我来说是一个临时解决方案。