我想知道文件写完的时间,为此我尝试使用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
?用户可能会写入多个文件,因此我需要知道哪个文件正在触发事件。
谢谢!
答案 0 :(得分:6)
触发事件的文件或目录相对于主受监视文件或目录的路径
所以我猜当path
为null
时,它是指定的文件或目录......
您需要自己跟踪原始路径。并将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问题。我知道这很糟糕,但它对我来说是一个临时解决方案。