2014-12-02 1 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 파일을 구문 분석 할 때 이유는 크기 = 0입니까? 이 경우 나는 어떤 FileNotFoundException도 얻지 못한다. 도움이 될 것입니다. 고맙습니다.

+0

[FileObserver'에 대한 JavaDocs] (https://developer.android.com/reference/android/os/FileObserver.html)에서 나는 새로운 파일에 대해'CREATE '이벤트, 0 개 이상의 MODIFY 이벤트 및 CLOSE_WRITE 이벤트가 있습니다. 어떤 이벤트가 발생하는지 확인하고 'CLOSE_WRITE'가 보이면 이벤트가 끝날 때까지 작업을 지연시켜야합니다. – CommonsWare

+0

문제는 이벤트가 발생하여 파일을 읽으려고 시도했지만 여전히 비어 있습니다. 나는 다른 것을 중첩해야합니까? 그 안에 CLOSE_WRITE를 넣은 후 그것을 읽어야합니까? – acostela

+0

"문제는이 이벤트가 발생하여 파일을 읽으려고해도 여전히 비어 있습니까?" 내 추측이야, 네. "CLOSE_WRITE에 대한 것이고 그 후에 읽으면 다른 것을 중첩해야합니까?" - 이건 내 앱이 아니기 때문에 대답 할 수 없다. – CommonsWare

답변

1

저는 inotify POSIX API의 전문가가 아니며, IIRC는 FileObserver입니다. 그러나 CREATE, MODIFYCLOSE_WRITE에 대해 별도의 이벤트가있는 경우 CREATE 이벤트가 파일 작성 전용 일뿐만 아니라 파일의 파일 시스템에 새 항목을 할당하는 이유가됩니다. 빈 파일이나 바이트의 초기로드가있는 파일을 만들지 만 전체 내용을 쓰려면 다른 MODIFY 호출이 필요할 수 있습니다. CLOSE_WRITE은 파일에 쓰는 사람이 파일 핸들을 닫았 음을 나타 내기 위해 호출됩니다.

따라서 생성하려는 파일이 있는지 살펴보고 파일을 읽으려면 CREATE을보고 나서 동일한 파일에 CLOSE_WRITE이 있는지 확인한 다음 읽은 다음 그 파일이 더 잘 작동하는지 확인하십시오.