특정 파일을 감지하고 포함 된 내용을 읽을 수 있도록 폴더를 모니터링 할 수 있어야하는 서비스를 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도 얻지 못한다. 도움이 될 것입니다. 고맙습니다.
[FileObserver'에 대한 JavaDocs] (https://developer.android.com/reference/android/os/FileObserver.html)에서 나는 새로운 파일에 대해'CREATE '이벤트, 0 개 이상의 MODIFY 이벤트 및 CLOSE_WRITE 이벤트가 있습니다. 어떤 이벤트가 발생하는지 확인하고 'CLOSE_WRITE'가 보이면 이벤트가 끝날 때까지 작업을 지연시켜야합니다. – CommonsWare
문제는 이벤트가 발생하여 파일을 읽으려고 시도했지만 여전히 비어 있습니다. 나는 다른 것을 중첩해야합니까? 그 안에 CLOSE_WRITE를 넣은 후 그것을 읽어야합니까? – acostela
"문제는이 이벤트가 발생하여 파일을 읽으려고해도 여전히 비어 있습니까?" 내 추측이야, 네. "CLOSE_WRITE에 대한 것이고 그 후에 읽으면 다른 것을 중첩해야합니까?" - 이건 내 앱이 아니기 때문에 대답 할 수 없다. – CommonsWare