android FileObserver的用法與避坑指南,androidobserver
昨天因為項目需要,需要做一個damo,用到了檔案監聽的功能,所以就使用了FileObserver(檔案觀察器)這個類,結果就被坑的不行不行的,昨天下班已經身心俱疲,本著跟bug呲牙必報的精神,這裡要將這筆賬記下,也希望大家以後不會在這上面浪費時間。
FileObserver的功能
故名思議,就是監聽檔案的事件啦,根據官方給出的文檔,有以下幾種事件的響應,對應不同的事件常量。
| 常量名 |
對應事件 |
| ACCESS |
開啟檔案後讀取檔案的操作 |
| ALL_EVENTS |
事件列表中的所有事件 |
| ATTRIB |
未明操作 |
| CLOSE_NOWRITE |
唯讀檔案被關閉 |
| CLOSE_WRITE |
讀寫檔案被編輯並關閉 |
| CREATE |
檔案被建立建立 |
| DELETE |
檔案被刪除 |
| DELETE_SELF |
自刪除事件 |
| MODIFY |
檔案被修改 |
| MOVED_FROM |
移出事件 |
| MOVED_TO |
移入事件 |
| MOVE_SELF |
自移動事件 |
| OPEN |
檔案被開啟 |
這些常量都是在FileObserver類裡面的,因此可以通過FileObserver.XXX來調用。
FileObserver可以監聽兩種類型的檔案:一種是單個檔案,另一種是檔案目錄。需要注意的是監聽檔案目錄的時候有個不能遞迴子目錄的問題,因此要麼確保監聽的檔案下沒有子目錄,要麼做特殊的操作,手動遞迴監聽每一個子目錄。
FileObserver的用法1.FileObserver是一個抽象類別,使用的時候我們需要自己實現一個類來繼承FileObserver。2.編寫構造方法
構造方法有兩種寫法:
第一種是只傳路徑參數
public FileObserver (String path)
其實使用這種方法的時候,為了防止發生嵌套調用產生死迴圈,我們可以在實現方法的時候進行一點最佳化。
public FileObserver (String path) { super( path, FileObserver.CREATE | FileObserver.DELETE );}
可以看到,我們繼承super方法的時候,調用了父類的另外一種構造參數,在第二個參數中,將我們需要監聽的事件傳了進去,這樣就可以保證過濾掉不需要的事件,降低發生死迴圈的機率。
第二種傳路徑和需要監聽的事件
public FileObserver (String path, int mask)
在第一種方法的最佳化中我們已經看到了這種方法的用法,使用中也可以使用這種方法來進行構造,相對於第一種方法,這種方法耦合性更低一些。
3.實現onEvent(int event, String path)方法
前面說了,FileObserver是一個抽象類別,這個onEvent方法就是它的抽象方法,需要在子類中進行實現。
@Overridepublic void onEvent(int event, String path) { /*event的值是與0x40000000進行或運算後的值,所以在case之前需要先和FileObserver.ALL_EVENTS進行與運算*/ int e = event & FileObserver.ALL_EVENTS; switch (e) { case FileObserver.CREATE: /*do something*/ break; }}
4.開啟與關閉監聽
在FileObserver中提供了開啟和關閉監聽的方法,只需要直接調用就可以了。
startWatching(); //開啟監聽stopWatching(); //結束監聽
需要注意的一點是作為監聽者的FileObserver需要一直保持一個引用來防止被java的GC機制幹掉,所以最好和一個持久性引用綁定工作,一般我們都使用Service來進行綁定使用。
5.許可權問題
網上所有關於使用FileObserver的教程都沒提及許可權的申請,但我昨天使用中就是因為許可權的問題導致一直監聽不到。而且FileObserver用到的許可權沒申請的時候不是常規的報錯提示,只是默默地罷工了,個人認為是在是最大的坑。
在資訊清單檔中加入以下許可權:
<!--往sdcard中寫入資料的許可權 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission><!--在sdcard中建立/刪除檔案的許可權 --><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
建議是在遇到如何都監聽不到的時候再加許可權,畢竟許可權申請太多有的使用者很反感的。
總結
通過上面的介紹可以看到,FileObserver的坑真的是超多,真是灘險石多,需要耐心和謹慎來盡量避免。
引用聲明
Android檔案或檔案夾內容改變監聽器(FileObserver)——mayingcai1987的部落格。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。