Estoy usando FileObserver para observar un directorio de cambios. El proceso funciona bien el 90% del tiempo, pero ocasionalmente falla.Android FileObserver pasando un evento no documentado 32768
Aquí es un ejemplo de trabajo de 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
Aquí está un ejemplo fallido:
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
Una vez que tengo el evento 32768 con un archivo nulo, todo se detiene. Revisé el origen de FileObserver y busqué inotify 32768 y no puedo encontrar el lugar al que se hace referencia.
El código para configurar el observador es el siguiente:
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();
El código para el Logcat es:
public synchronized void itemDirChanged(int event, String file) {
Log.i(LOG, "Received item event for item " + itemId + ", event: " + event + ", file: " + file);
switch (event) {
<snip>
alguna idea de qué 32768 y archivo nulo significa?
Decidí presentar esto como un error: http://code.google.com/p/android/issues/detail?id=29546&q=FileObserver&colspec=ID%20Type%20Status % 20Propietario% 20Summary% 20Stars – mvsjes2
compruebe esta pregunta: http://stackoverflow.com/questions/2452661/file-observer-problem – Ciprian
Gracias. El problema parece ser que, incluso después de invocar a StopWatching, puede obtener múltiples eventos 32768 en su devolución de llamada antes de que su objeto observador sea basura, por lo que necesita admitir eventos en su clase de observador después de haber llamado a detención. OMI, después de llamar a StopWatching, ya no deberías tener que preocuparte más.La clase FileObserver ciertamente necesita ser actualizada para estar más sincronizada con inotify. – mvsjes2