변경 사항을 위해 디렉토리를 관찰하기 위해 FileObserver을 사용하고 있습니다. 이 프로세스는 90 %의 시간 동안 정상적으로 작동하지만 때로는 실패합니다. 여기Android FileObserver가 문서화되지 않은 이벤트를 전달합니다. 32768
는 로그 캣의 작업 예입니다
내가 널 파일로 32768 이벤트를 일단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
이 모든 것이 정지 :
여기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
실패한 예입니다. 내가 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();
로그 캣의 코드는 다음과 같습니다
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 및 널 (null) 파일을 의미?
이 파일을 버그로 신고하기로 결정했습니다. http://code.google.com/p/android/issues/detail?id=29546&q=FileObserver&colspec=ID%20Type%20Status % 20Owner % 20Summary % 20Stars – mvsjes2
이 질문에 대한 답변 : http://stackoverflow.com/questions/2452661/file-observer-problem – Ciprian
Thanks. 문제는 stopWatching이 호출 된 후에도 옵저버 객체가 가비지 수집되기 전에 콜백에서 여러 개의 32768 이벤트를 얻을 수 있으므로 stopWatching을 호출 한 후 옵저버 클래스에서 이벤트를 처리해야합니다. IMO, stopWatching이 호출 된 후에 더 이상 걱정할 필요가 없습니다.FileObserver 클래스는 확실히 inotify와 동기화되도록 업데이트해야합니다. – mvsjes2