11

我正在使用FileObserver来观察目录的变化。该过程在 90% 的情况下都能正常工作,但偶尔会失败。

这是 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 和空文件是什么意思吗?

4

4 回答 4

8

感谢这个答案

此处列出了事件代码。

尤其是 32768 是这样的:

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

于 2013-01-17T20:04:53.603 回答
1

我也遇到过偶尔的失败。

我发现了 Android FileObserver 的一个大问题:你不能让两个 FileObserver 在你的应用程序中监视同一个文件夹。

如果您调用StopWatching一个 FileObserver,正在观看同一文件夹的任何其他 FileObserver 也将停止观看。

于 2014-12-02T03:46:50.630 回答
1

我遇到的问题是我的 FileObserver 收到 32768 事件并停止工作。几天来,我拼命想了解如何解决这个问题(不重新创建 FileObserver)。

首先,我发现虽然我对我的 FileObserver 有一个硬引用,但这个事件 (32768) 可以由垃圾收集触发(当我通过 DDMS 强制它时)。

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

有谁知道让多个观察员进入同一个目录是否合法?我找不到任何关于它的信息

于 2015-03-27T08:42:16.660 回答
0

onEvent() 中的事件不会以文档的形式返回确切的数字,您需要如下包装

public void onEvent(int event, String path) {

        if ((FileObserver.CREATE & event)!=0) {
            PUtils.log("CREATE: " + rootPath + path);
        } else if ((FileObserver.MODIFY & event)!=0) {
            PUtils.log("MODIFY: " + rootPath + path);
        } else if ((FileObserver.DELETE & event)!=0) {
            PUtils.log("DELETE: " + rootPath + path);
        } else if ((FileObserver.DELETE_SELF & event)!=0) {
            PUtils.log("DELETE_SELF: " + rootPath + path);
        } else if ((FileObserver.MOVED_FROM & event)!=0) {
            PUtils.log("MOVED_FROM: " + rootPath + path);
        } else if ((FileObserver.MOVED_TO & event)!=0) {
            PUtils.log("MOVED_TO: " + rootPath + path);
        } else if ((FileObserver.MOVE_SELF & event)!=0) {
            PUtils.log("MOVE_SELF: " + rootPath + path);
        } else {
            PUtils.log("Unhandled event " + event + rootPath + path);
        }
于 2018-08-12T02:48:34.313 回答