Создание уведомлений о тостах в FileObserver - PullRequest
2 голосов
/ 18 октября 2011

Я использую FileObserver для отслеживания определенной папки и загрузки новых входящих файлов на свой собственный сервер, анализа результатов и распечатки уведомлений пользователя о результатах. Фрагмент кода выглядит следующим образом:

FileInputStream in = new FileInputStream(filePath);
data = readBytes(in);
if (data.length > 1){

    //Upload method here

    results = G.Upload(data);

    if(results.equals("PASS")){
        //Toast here
    }

    if(results.equals("FAIL")){
        //Different toast here
    }
}

Могу ли я создать тост внутри или мне нужно передать переменную results другому классу и напечатать оттуда уведомление о тосте? Большое спасибо.

РЕДАКТИРОВАТЬ: Приведенный выше фрагмент находится в классе FileObserver.

1 Ответ

2 голосов
/ 18 октября 2011

Хорошо, попробуйте это

Сначала давайте создадим интерфейс под названием 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:

Отслеживаемый файл или каталог должен существовать в это время, иначе никакие события не будут сообщены (даже если они появятся позже).Если мониторинг уже запущен, этот вызов не имеет никакого эффекта.

Поэтому убедитесь, что вы уже начали скачивать файл.

...