2012-04-24 27 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到同一個文件夾。只要我刪除它,一切開始工作。

有沒有人知道讓幾個觀察者訪問同一目錄是否合法?我找不到任何有關它的信息