2015-01-16 2 views
0

이상한 질문 일 수 있습니다.하지만 FileObserver를 처음 사용하고 있습니다. 내가 작성한 코드는이벤트가 FileObserver에 의해 트리거되지 않음

public class FileChanges extends FileObserver { 
public static int CHANGES_ONLY = CLOSE_WRITE | MOVE_SELF | MOVED_FROM; 

List<SingleFileObserver> mObservers; 
String mPath; 
int mMask; 
Context mContext; 

public FileChanges(String path, Context mContext) { 
    this(path, ALL_EVENTS, mContext); 
    this.mContext = mContext; 
} 

public FileChanges(String path, int mask, Context mContext) { 
    super(path, mask); 
    this.mContext = mContext; 
    mPath = path; 
    mMask = mask; 
} 

@Override 
public void startWatching() { 
    if (mObservers != null) 
     return; 
    mObservers = new ArrayList<SingleFileObserver>(); 
    Stack<String> stack = new Stack<String>(); 
    stack.push(mPath); 

    while (!stack.empty()) { 
     String parent = stack.pop(); 
     mObservers.add(new SingleFileObserver(parent, mMask)); 
     File path = new File(parent); 
     File[] files = path.listFiles(); 
     if (files == null) 
      continue; 
     for (int i = 0; i < files.length; ++i) { 
      if (files[i].isDirectory() && !files[i].getName().equals(".") 
        && !files[i].getName().equals("..")) { 
       stack.push(files[i].getPath()); 
      } 
     } 
    } 
    for (int i = 0; i < mObservers.size(); i++) 
     mObservers.get(i).startWatching(); 
} 

@Override 
public void stopWatching() { 
    if (mObservers == null) 
     return; 

    for (int i = 0; i < mObservers.size(); ++i) 
     mObservers.get(i).stopWatching(); 

    mObservers.clear(); 
    mObservers = null; 
} 

@Override 
public void onEvent(int event, String path) { 
    if (event == FileObserver.ALL_EVENTS) 
     Toast.makeText(mContext, "File Event", Toast.LENGTH_SHORT).show(); 
} 

private class SingleFileObserver extends FileObserver { 
    private String mPath; 

    public SingleFileObserver(String path, int mask) { 
     super(path, mask); 
     mPath = path; 
    } 

    @Override 
    public void onEvent(int event, String path) { 
     String newPath = mPath + "/" + path; 
     FileChanges.this.onEvent(event, newPath); 
    } 
    } 
} 

그리고 나중에에서 OnCreate 함수에서 MainActivity에서 나는 아래의 함수를 호출하고 있습니다입니다.

filechanges = new FileChanges(Environment.getExternalStorageDirectory() 
      .toString(), this); 
filechanges.startWatching(); 

FileObserver가 트리거되지 않는 이유가 없습니다. 나도 하나의 디렉토리를 시도했지만 작동하지 않습니다.

답변

관련 문제