2013-05-31 67 views
4

這是我的代碼:FileObserver修改不工作

public class SyncNotifyService extends Service { 
    private final static String TAG = "FileService"; 
    SDCardListener fileObserver = null; 


@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

public File getCacheDir() { 
    if (!StorageUtil.isExternalStorageAvailable()) { 
     return null; 
    } 

    File dir = new File(Environment.getExternalStorageDirectory(), "Cache"); 
    return dir; 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 
    Log.d(TAG, "onCreate"); 

    fileObserver = new SDCardListener(FileCache.getCacheDir().getPath(), FileObserver.MODIFY); 
    fileObserver.startWatching(); 
} 

class SDCardListener extends FileObserver { 
    public SDCardListener(String path, int mask) { 
     super(path, mask); 
    } 

    @Override 
    public void onEvent(int event, String path) { 
     final int action = event & FileObserver.ALL_EVENTS; 
     switch (action) { 
     case FileObserver.MODIFY: 
      Log.d(TAG, "event: MODIFY"); 
      break; 
     } 
    } 
} 

}

您好,我使用此代碼通知目錄。但我發現它永遠不會調用onEvent使用FileObserver.MODIFY參數,有人知道如何編寫正確的代碼? 我的Android版本是4.1.1

回答

0

也許你在寫你的onEvent方式是不妥當的,使用

if (!event.equals(MODIFY)) { return;} 

//the code you want 
if (path.equals(blah blah blah)) { 
//some code.. 
} 

這是我在FileObserver使用的方式,嘗試...

0

當您創建FileObserver的路徑應該是絕對的目錄包含您所觀察的文件:

fileObserver = new SDCardListener(FileCache.getCacheDir().getAbsolutePath(), FileObserver.MODIFY); 

另外,更改此:

public void onEvent(int event, String path) { 

    switch (action) { 
    case FileObserver.MODIFY: 
     Log.d(TAG, "event: MODIFY"); 
     break; 
    } 
} 

如果未觸發onEvent,請嘗試更改初始化FileObserver的方式,以便它監聽ALL_EVENTS並打印觸發事件。然後你可以找出爲什麼MOD​​IFY不是觸發器。