【问题标题】:FileObserver -> onEvent(event, path): path is NULLFileObserver -> onEvent(event, path): 路径为 NULL
【发布时间】:2013-02-19 08:49:21
【问题描述】:

我想知道文件何时完成写入,为此我正在尝试使用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?有可能用户写入了多个文件,所以我需要知道是哪个文件触发了事件。

谢谢!

【问题讨论】:

    标签: android fileobserver


    【解决方案1】:

    根据documentation of onEvent()

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

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

    您需要自己跟踪原始路径。并将onEvent()path 附加到此路径以获得完整路径(除非您正在跟踪文件并且其值始终为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();
    

    我试图使示例尽可能接近您的代码 sn-p。但是,创建一个扩展FileObserver 的完整类要好得多,因此您可以添加一个构造函数来存储basePath,并且不需要从类/实例外部访问公共字段!

    【讨论】:

    • 那么在哪些情况下“路径”会是非空的,在这种情况下它的值意味着什么?
    • 我想当文件被移动时(参见 MOVED_FROM、MOVED_TO 等事件)path 将包含新位置(相对于观察到的目录/或文件,参见我的代码 sn-p) .
    【解决方案2】:

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

    我是 Android 开发新手,还不熟悉执行此操作的正确方法,但通过插入 Thread.sleep 暂时避免了 NULL 问题。我知道这很糟糕,但它对我来说是一种临时解决方案。

    【讨论】:

    • 问题仍然存在,据我所知,没有很好的方法来处理这个问题。与其在主 UI 线程上停下来做这项工作,不如使用另一个线程,但这仍然很糟糕。