android FileObserver的用法與避坑指南,androidobserver

來源:互聯網
上載者:User

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的部落格。

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.