11

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

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 と null ファイルが何を意味するか考えていますか?

4

4 に答える 4

8

この回答に感謝します。

イベント コードはここにリストされています。

特に32768はこれです:

#define IN_IGNORED 0x00008000 /* ファイルは無視されました */

于 2013-01-17T20:04:53.603 に答える
1

FileObserver が 32768 イベントを取得して動作を停止するという問題がありました。数日間、(FileObserverを再作成せずに)これを修正する方法を必死に理解しようとしました。

最初に、FileObserver へのハード リファレンスがありますが、このイベント (32768) はガベージ コレクションによってトリガーされる可能性があることがわかりました (DDMS を介して強制した場合)。

最終的に、プログラム内の同じフォルダーに別の FileObserver があることがわかりました。削除するとすぐに、すべてが機能し始めました。

複数のオブザーバーを同じディレクトリに配置することが合法かどうか知っている人はいますか? 私はそれについての情報を見つけることができませんでした

于 2015-03-27T08:42:16.660 に答える