2014-12-02 3 views
0

Мне нужно реализовать службу в android, которая должна иметь возможность контролировать папку для обнаружения определенного файла и чтения того, что он содержит. У меня странное поведение с моим кодом, и я не могу найти причину. Это мой соответствующий код.Android-файл наблюдателя странное поведение

public void onCreate(){ 
    lectorFichCSV = new LectorFichCSV(); //object to read CSV files  
    ftpFileObserver = new FileObserver(filePath.getAbsolutePath()){ 
     public void onEvent(int event, String file) { 
      if((FileObserver.CREATE & event) != 0){ 
       Log.i("INFO: ", filePath.getAbsolutePath() + "/" + file + " is created"); 
       if(file.substring(0,3).equals("RVE")){ //If file is created and the one I expect 
        try{ 
         Log.i("INFO: ", "We have a RVE answer"); 
         is = new FileInputStream(filePath + "/" + file); 
         lineaVent = lectorFichCSV.parseCSVFileAsList(is); //Get information in a list 
         //Get dao from ORMLite 
         dao = getHelper().getLineaVentDao(); 
         Iterator<String[]> iterator = lineaVent.iterator(); 
         if(iterator.hasNext()){ 
          String[] aux = iterator.next(); 
          Log.i("INFO:", "CodLineaVent "+aux[0]); 
          if(aux[2].equals("S")){ 
           //Update DB information accordin to my file 
           UpdateBuilder<LineaVent, Integer> updateBuilder = dao.updateBuilder(); 
           updateBuilder.where().eq("_id", aux[0]); 
           updateBuilder.updateColumnValue("valido", true); 
           updateBuilder.updateColumnValue("saldo", true); 
           updateBuilder.update(); 
           lineaVent.clear(); 
          }else if(aux[2].equals("N")){ 
           UpdateBuilder<LineaVent, Integer> updateBuilder = dao.updateBuilder(); 
           updateBuilder.where().eq("_id", aux[0]); 
           updateBuilder.updateColumnValue("saldo", false); 
           updateBuilder.update(); 
           lineaVent.clear(); 
          } 
          File fileToDel = new File(filePath + "/" + file); 
          fileToDel.delete(); 
         } 
        }catch(FileNotFoundException e){ 
         e.printStackTrace(); 
        }catch(SQLException e){ 
         e.printStackTrace(); 
        } 
       } 

Я отлажена код и иногда работает, а иногда я получаю lineaVent.size() == 0. Я схожу с ума с этим, я думаю, это возможно, что события происходит быстрее, чем создание моего файла? это было бы причиной, когда я попытался проанализировать мой файл CSV в моем объекте List размером = 0? В этом случае я не получаю FileNotFoundException. Любая помощь будет оценена. Спасибо.

+0

От чтения [JavaDocs для 'FileObserver'] (https://developer.android.com/reference/android/os/FileObserver.html), я ожидал бы, что для нового файла я бы получил' CREATE 'событие, ноль или больше событий' MODIFY' и событие 'CLOSE_WRITE'. Посмотрите, какие события вы получите, и если вы видите 'CLOSE_WRITE', вы, вероятно, должны задерживать свою работу до этого события. – CommonsWare

+0

Итак, проблема в том, что происходит событие, я пытаюсь прочитать файл, и он все еще пуст? Должен ли я вложить другое значение If внутри этого для CLOSE_WRITE и после этого прочитать его? – acostela

+0

«Итак, проблема в том, что происходит событие, я пытаюсь прочитать файл, и он все еще пуст?» - Это моя догадка, да. «Должен ли я вложить другой, если внутри этого для CLOSE_WRITE, и после этого его прочитать?» - Я не могу ответить на это, так как это ваше приложение, а не мое. – CommonsWare

ответ

1

Я не эксперт с POSIX API inotify, который, IIRC, лежит в основе FileObserver. Однако, учитывая, что существуют отдельные события для CREATE, MODIFY и CLOSE_WRITE, можно предположить, что событие CREATE предназначено исключительно для создания файла - другими словами, выделения новой записи в файловой системе для файла. Это либо создало бы пустой файл, либо, возможно, файл с начальной загрузкой байтов, но там, где могли бы потребоваться другие вызовы MODIFY, чтобы выписать полное содержимое. Затем будет вызываться CLOSE_WRITE, чтобы указать, что тот, кто писал в файл, теперь закрыл свой дескриптор файла.

Следовательно, если вы ищете какой-либо файл, который будет создан, прочитайте его, посмотрите на CREATE, затем посмотрите на CLOSE_WRITE в этом же файле, а затем попробуйте его прочитать и посмотрите, работает ли это лучше.

Смежные вопросы