Ответ 1
Благодаря этому ответу.
Коды событий перечислены здесь.
32768 в частности это:
#define IN_IGNORED 0x00008000/* Файл игнорируется */
Я использую 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 и нулевой файл?
Благодаря этому ответу.
Коды событий перечислены здесь.
32768 в частности это:
#define IN_IGNORED 0x00008000/* Файл игнорируется */
Я тоже страдал от случайных неудач.
Я обнаружил большую проблему с Android FileObserver: у вас не должно быть двух FileObservers, просматривающих одну и ту же папку в вашем приложении.
Если вы вызываете StopWatching
на одном FileObserver, любой другой FileObserver, который смотрит одну и ту же папку, также перестает смотреть.
У меня была проблема, что мой FileObserver получает событие 32768 и перестает работать. Я отчаянно пытался понять, как исправить это (не воссоздавая FileObserver) на пару дней.
Сначала я обнаружил, что, хотя у меня есть твердая ссылка на мое FileObserver, это событие (32768) может быть вызвано сборкой мусора (когда я принудил его через DDMS).
В конце концов я обнаружил, что в моей программе был еще один FileObserver в той же папке. Как только я удалил все, все стало работать.
Кто-нибудь знает, если законно иметь нескольких наблюдателей в том же каталоге? Я не мог найти никакой информации об этом