5

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

谢谢!

4

2 回答 2

7

根据以下文件onEvent()

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

所以我猜它什么时候pathnull指定的文件或目录......

您需要自己跟踪原始路径。并将pathof附加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并且不需要从类/实例外部访问公共字段!

于 2013-02-19T09:01:00.453 回答
4

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

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

于 2013-05-22T19:16:33.623 回答