Подтвердить что ты не робот

Android FileObserver передает недокументированное событие 32768

Я использую 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 и нулевой файл?

4b9b3361

Ответ 1

Благодаря этому ответу.

Коды событий перечислены здесь.

32768 в частности это:

#define IN_IGNORED 0x00008000/* Файл игнорируется */

Ответ 2

Я тоже страдал от случайных неудач.

Я обнаружил большую проблему с Android FileObserver: у вас не должно быть двух FileObservers, просматривающих одну и ту же папку в вашем приложении.

Если вы вызываете StopWatching на одном FileObserver, любой другой FileObserver, который смотрит одну и ту же папку, также перестает смотреть.

Ответ 3

У меня была проблема, что мой FileObserver получает событие 32768 и перестает работать. Я отчаянно пытался понять, как исправить это (не воссоздавая FileObserver) на пару дней.

Сначала я обнаружил, что, хотя у меня есть твердая ссылка на мое FileObserver, это событие (32768) может быть вызвано сборкой мусора (когда я принудил его через DDMS).

В конце концов я обнаружил, что в моей программе был еще один FileObserver в той же папке. Как только я удалил все, все стало работать.

Кто-нибудь знает, если законно иметь нескольких наблюдателей в том же каталоге? Я не мог найти никакой информации об этом