Android 基于更改上载文件的智能方式

Android 基于更改上载文件的智能方式,android,inotify,fileobserver,Android,Inotify,Fileobserver,我的应用程序必须监视目录中的文件更改,并在每次更改时上载副本。为此,我使用了FileObserver。我在创建、移动到、关闭写入和修改时将其上载。问题在于修改。每次将更改写入磁盘时都会调用Modify,如果文件很大(正在复制或大量更改)不是原子文件,那么它会触发数百个修改事件,这会使我的应用程序崩溃,因为它尝试上载太多次,然后崩溃。我的第一个想法是删除modify事件,这样它只有在调用Close Write时才会上传。不幸的是,这并不总是被称为。所以我有点被修改卡住了。所以我的问题是:在检测文件

我的应用程序必须监视目录中的文件更改,并在每次更改时上载副本。为此,我使用了
FileObserver
。我在创建、移动到、关闭写入和修改时将其上载。问题在于修改。每次将更改写入磁盘时都会调用Modify,如果文件很大(正在复制或大量更改)不是原子文件,那么它会触发数百个修改事件,这会使我的应用程序崩溃,因为它尝试上载太多次,然后崩溃。我的第一个想法是删除modify事件,这样它只有在调用Close Write时才会上传。不幸的是,这并不总是被称为。所以我有点被修改卡住了。所以我的问题是:在检测文件修改的结束时,有没有最佳实践?我需要上传这个文件,当它完成修改,而不是当。你打算怎么做?如何发现上次修改事件何时触发。我需要制作一个复杂的计时器系统吗,还是有更简单的方法。(如果没有,你能告诉我制作这种计时器系统的最佳实践吗?)

我知道我问了很多问题,但我希望能有任何头脑风暴和想法

谢谢


编辑:所以我发现了一些奇怪的东西。至少在安卓4.2上,
Open
从不触发,因此
close
从不触发。仅供参考。

如果文件是基于文本的,您可以区分原始文件和修改后的文件,只有在不同行数足够大的情况下才能上载文件

使用工作线程,每x秒测试一次文件的更改,如果更改了,则将更新的版本发送到任何需要的地方。为了避免发送正在为file.isOpen编写的文件,或者使用布尔值来跟踪正在发生的更改。

如果运气好的话,可以做一些类似于跟踪修改事件之间的时间间隔的事情,假设收到的更改或多或少一致

 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)

基于文本的文件实际上工作正常。它们通常是原子操作,触发修改并关闭写操作一次。+1对于创造性,没有想到这一点。如果所有的文件都是严格基于文本的,那么它就可以工作了。但它们不是。
File.isOpen()
?如果我能找到的话,听起来很有用。你在说什么,这是某种库吗?使用FileObserver并跟踪打开/关闭事件。您还可以使用文件锁来确保相互访问该文件。如果您的文件是按顺序访问的,请使用布尔变量。好的,我是这样做的。。。有点像这样。我使用hashmap和timertask将多个事件瓶颈化为10秒的延迟。谢谢