Отслеживание модификации файла (Android)

Чтобы отследить события модификации файла (-ов), существует класс FileObserver, который умеет мониторить объекты файловой системы в отдельном потоке.

Также, для пущей важности можно создать отдельный сервис и запихнуть этот механизм туда.


Создание

1) создать сервис, внутри которого создать экземпляр класса FileObserver  и запустить:

2) Объявить сервис в манифесте:

3) создать намерение и запустить сервис:


Отправка сообщений в активность

Чтобы из сервиса отправить уведомление в активность о модификации файла:

1) Создать BroadcastReceiver в своей активности, который получит Intent с переданным сообщением.

2) создать IntentFilter и зарегистрировать BroadcastReceiver в onCreate():

3) отменить регистрацию BroadcastReceiver в onDestroy():

4) отправить сообщение из сервиса при наступлении события модификации файла:


Проблема

Через какое-то время отслеживание файла перестает работать (обработчик onEvent() не вызывается).

Обсуждение на stackoverflow.

Причина:

Описание к FileObserver:

“Warning: If a FileObserver is garbage collected, it will stop sending events. To ensure you keep receiving events, you must keep a reference to the FileObserver instance from some other live object.”

Решение:

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

2) Как и в (1), экземпляр сохранять как свойство класса, но также пометить как static. Мне помогло.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *