2013-07-24 7 views
1

Мое приложение должно следить за изменениями файлов в каталоге и загружать их при каждом изменении. Для этого я использовал использование FileObserver. У меня есть загрузка на Creation, Move To, Close Write и Modify. Проблема заключается в модификации. Modify вызывается каждый раз, когда изменение записывается на диск, который, если файл большой (скопированный или много измененный), не является атомарным, поэтому он запускает сотни событий Modify, это делает мое приложение уродным, потому что оно пытается загрузить так много раз, и он падает. Моя первая мысль заключалась в том, чтобы удалить событие изменения, чтобы оно загружалось только при вызове метода «Закрыть запись». К сожалению, это не всегда называется. Поэтому я немного застрял в Modify. Поэтому мой вопрос заключается в следующем: есть ли лучшая практика, когда дело доходит до обнаружения изменения файла? Мне нужно загрузить этот файл, когда он будет изменен, а не пока. Как бы вы это сделали? Как я могу узнать, когда вызывается последнее событие Modify. Должен ли я создавать сложную систему таймера, или есть более простой способ. (Если нет, не могли бы вы рассказать мне о лучшей практике создания такой системы таймера?)Умный способ загрузки файлов на основе изменений

Я знаю, что я много просил, но я был бы признателен за любые мозговые штурмы и идеи.

Спасибо!

Редактировать: Итак, я нашел что-то странное. По крайней мере, на Android 4.2, Open никогда не срабатывает, поэтому close никогда не срабатывает. Просто FYI.

ответ

1

Используйте рабочий поток, который проверяет файл на предмет изменений каждые x секунд, и если он изменен, отправьте обновленную версию туда, где вам нужно. Чтобы не отправлять файл, который записывает тест для File.isOpen, или использовать логическое значение для отслеживания происходящих изменений.

+0

'File.isOpen()'? Это звучит полезно, если я могу его найти. О чем ты говоришь, это какая-то библиотека? –

+0

Используйте FileObserver и отслеживайте события open/close. Вы также можете использовать FileLock http://developer.android.com/reference/java/nio/channels/FileLock.html для обеспечения взаимного доступа к файлу. Если к файлу обращаются последовательно, используйте переменную типа boolean. –

+0

Хорошо, я сделал ... вроде этого. Я использовал hashmap и timertask для того, чтобы помешать множественным событиям за десять секунд задержки. Благодаря! –

1

Если файлы основаны на тексте, возможно, вы можете сравнить исходный файл и измененный файл и загрузить его только в том случае, если количество различных строк достаточно велико.

+0

Текста на основе файлов на самом деле те, которые работают хорошо. Они чаще всего являются атомарными операциями, которые срабатывают один раз. –

+0

+1 для творчества, хотя, не думал об этом. Это сработало бы, если бы все файлы были строго текстовыми. Они, однако, не так. –

1

С везением, можно сделать что-то вроде отслеживать время между событиями модификации, при условии, что они получили более или менее последовательно ...

last-notification = now; 
notification-interval = 1 s; /* some default */ 
listen for (file closed); 
listen for (file modified); 
alarm at (now + notification-interval); 

on (file modified) = 
     cancel alarm; 
     notification-interval = max (notification-interval 
            | [now - last-notification]); 
     alarm at (now + 2 × notification-interval); 

on (file closed) = 
     cancel alarm; 
     do upload; 

on (alarm) = 
     if (file is open?) then alarm at (now + 2 × notification-interval); 
     else (signal file closed)