Хорошо, попробуйте это
Сначала давайте создадим интерфейс под названием Observer
public interface ObserverActivity{
public void onFileObserved(int Event, String path);
}
Далее давайте создадим наш FileObserverSubclass
public class MyFileObserver extends FileObserver{
private HashSet<ObserverActivity> registeredObservers;
public MyFileObserver(String path) {
super(path, FileObserver.ALL_EVENTS);
absolutePath = path;
registeredObservers = new HashSet<ObserverActivity>();
}
public void registerObserver(ObserverActivity toRegister){
registeredObservers.add(toRegister);
}
public void unregisterObserver(ObserverActivity toUnregister){
registeredObservers.remove(toUnregister);
}
public void onEvent(int Event, String path){
for(ObserverActivity o: registeredObervers){
o.onFileObserved(Event, path);
}
}
}
Наконец, в упражнении, в котором мы хотим сделать тосты, мы делаем следующее:
public class MyActivity extends Activity implements ObserverActivity{
MyFileObserver myFileObserver;
protected onCreate(Bundle icicle){
//other setup stuff
myFileObserver = new MyFileObsever("path/to/monitor");
myFileObserver.registerObserver(this);
myFileObserver.startWatching();
}
protected onPause(){
myFileObserver.stopWatching();
myFileObserver.unregisterObserver(this);
}
protected onResume(){
myFileObserver.registerObserver(this);
myFileObserver.startWatching();
}
public void onFileObserved(int Event, String Path){
//do toast in here.
}
Вы должны сделать остановку и отменить регистрацию, потому что есть шанс, что мы никогда не вернемся к этому упражнению или оно может быть уничтожено,Если мы никогда не вернемся к этому, мы будем продолжать наблюдать за файлом и использовать любые ресурсы, которые влекут за собой.Это расточительно и плохо.Нам нужно отменить регистрацию, потому что если действие уничтожено, наблюдатель файла вызовет исключение нулевого указателя при попытке вызвать метод onFileObserved.
Обратите внимание, что в соответствии с документацией для функции startWatching:
Отслеживаемый файл или каталог должен существовать в это время, иначе никакие события не будут сообщены (даже если они появятся позже).Если мониторинг уже запущен, этот вызов не имеет никакого эффекта.
Поэтому убедитесь, что вы уже начали скачивать файл.