我的应用必须关注目录的文件更改,并在进行更改时上传副本。为此,我使用了FileObserver
。我将它上传到Creation,Move To,Close Write和Modify。问题在于修改。每次将更改写入磁盘时都会调用Modify,如果文件很大(被复制或大量更改)不是原子的,那么它会触发数百个Modify事件,这会让我的应用程序因为尝试上传而烦恼很多次,它崩溃了。我的第一个想法是删除修改事件,这样它只会在调用Close Write时上传。不幸的是,这并不总是被称为。所以我有点坚持修改。所以我的问题是:在检测文件修改结束时是否有最佳实践?我需要在修改完文件时上传此文件,而不是在同时修改。你会怎么做呢?如何发现上次Modify事件的触发时间。我是否必须制作复杂的计时器系统,或者是否有更简单的方法。 (如果没有,你能告诉我制作这样一个计时器系统的最佳做法吗?)
我知道我已经问了很多,但我很欣赏任何头脑风暴和想法。
谢谢!
编辑:所以我发现了一些奇怪的东西。至少在Android 4.2上,Open
永远不会触发,因此close
永远不会触发。只是一个FYI。
答案 0 :(得分:1)
如果文件是基于文本的,您可以对原始文件和修改后的文件进行区分,并且只有在不同行的数量足够大时才上传文件。
答案 1 :(得分:1)
使用工作线程测试文件每x秒更改一次,如果更改,则将更新后的版本发送到您需要的任何位置。避免发送正在为File.isOpen编写测试文件或使用布尔值来跟踪发生的更改。
答案 2 :(得分:1)
运气好的话,人们可能会做一些事情,比如跟踪修改事件之间的时间,假设它们或多或少地得到了一致......
last-notification = now;
notification-interval = 1 s; /* some default */
listen for (file closed);
listen for (file modified);
alarm at (now + notification-interval);
on (file modified) =
cancel alarm;
notification-interval = max ( notification-interval
| [now - last-notification] );
alarm at (now + 2 × notification-interval);
on (file closed) =
cancel alarm;
do upload;
on (alarm) =
if (file is open?) then alarm at (now + 2 × notification-interval);
else (signal file closed)