2012-04-24 29 views
8

我正在使用FileObserver来观察目录中的更改。该流程在90%的时间内正常工作,但偶尔也会失败。Android FileObserver传递未记录的事件32768

这里的logcat的工作示例:

04-23 21:12:03.873: V/ItemObserver(1663): Setting up new item observer for item 2 
04-23 21:12:04.374: I/ItemObserver(1663): Received item event for item 2, event: 256, file: batch.get.47 
04-23 21:12:07.866: I/ItemObserver(1663): Received item event for item 2, event: 512, file: batch.get.47 
04-23 21:12:07.873: I/ItemObserver(1663): Received item event for item 2, event: 512, file: item.xml 
04-23 21:12:07.883: I/ItemObserver(1663): Received item event for item 2, event: 256, file: item.xml 
04-23 21:12:08.033: I/ItemObserver(1663): Received item event for item 2, event: 8, file: item.xml 

这是一个失败的例子:

04-23 22:08:09.403: V/ItemObserver(1751): Setting up new item observer for item 2 
04-23 22:08:09.813: I/ItemObserver(1751): Received item event for item 2, event: 256, file: batch.get.52 
04-23 22:08:09.954: I/ItemObserver(1751): Received item event for item 2, event: 32768, file: null 

一旦我得到了32768的事件有一个空文件,一切都停止。我已经检查了FileObserver的源代码并搜索了inotify 32768,并且无法找到它在任何地方被引用的地方。

成立观察者的代码如下:

itemDirObserver = new FileObserver(getItemsCache().getProcessedItemDir(itemId).getPath(), 
FileObserver.CLOSE_WRITE | FileObserver.CREATE | FileObserver.DELETE) { 
    @Override 
    public void onEvent(int event, final String file) { 
    itemDirChanged(event, file); 
    } 
}; 
itemDirObserver.startWatching(); 

的logcat的代码是:

public synchronized void itemDirChanged(int event, String file) { 
    Log.i(LOG, "Received item event for item " + itemId + ", event: " + event + ", file: " + file); 
    switch (event) { 
<snip> 

任何想法是32768个空文件表示?

+0

我决定将这个文件作为一个错误提交:http://code.google.com/p/android/issues/detail?id=29546&q=FileObserver&colspec=ID%20Type%20Status %20Owner%20Summary%20Stars – mvsjes2 2012-04-25 22:11:53

+0

检查此问题:http://stackoverflow.com/questions/2452661/file-observer-problem – Ciprian 2012-05-10 13:08:08

+0

谢谢。问题似乎是,即使在调用stopWatching之后,在您的观察者对象被垃圾收集之前,您可以在回调中获取多个32768事件,因此您需要在调用stopWatching之后在观察者类中嵌入事件。国际海事组织,在stopWatching被调用后,你不应该再担心它。FileObserver类当然需要更新以与inotify更加同步。 – mvsjes2 2012-06-01 15:13:56

回答

6

感谢this answer

事件代码列出here

32768尤其是这样的:

的#define IN_IGNORED 0x00008000/*文件被忽略*/

+0

但是你知道'IN_IGNORED'的含义吗?这是否意味着fileobserver不再观看它? – 2014-11-30 22:29:27

+1

我不太了解它,tbh,但我发现这个:http://stackoverflow.com/a/4665947/931277。看起来像一个原因是被删除的节点。这意味着你不会收到该节点的更多事件。 – dokkaebi 2014-12-01 20:19:23

+1

IN_IGNORED在以下情况下触发:inotify监视器被删除(例如,FileObserver关闭时),文件(及其所有硬链接)被删除或包含文件的分区被卸载时(与保存打开的文件不同描述符,如果你只是通过inotify监控一个文件,你的程序不会被杀死)。 – user1643723 2016-12-27 09:08:12

1

我也从偶然失败的痛苦。

我发现了Android FileObserver的一个大问题:在应用程序中,您不能有两个FileObserver观察同一个文件夹。

如果您在一个FileObserver上调用StopWatching,则任何正在监视相同文件夹的其他FileObserver也将停止监视。

+1

这是'FileObserver'中的一个错误(它有更多的错误......):如果您尝试为文件添加监视,那么当该inode的另一个监视已经存在时,Linux inotify API将返回现有监视。这在FileObserver源代码中没有考虑到。为同一个文件/目录添加多个手表,或者为同一文件(共享inode)添加不同硬链接的手表将触发观察到的行为。 – user1643723 2016-12-27 09:05:51

0

我有问题,我的FileObserver获取32768事件并停止工作。我拼命尝试了解如何解决这个问题(无需重新创建FileObserver)几天。

首先我发现尽管我对FileObserver有一个很强的参考,但是这个事件(32768)可以通过垃圾回收(当我强制通过DDMS时)触发。

最终我发现我的程序中有另一个FileObserver到同一个文件夹。只要我删除它,一切开始工作。

有没有人知道让几个观察者访问同一目录是否合法?我找不到任何有关它的信息