当我们要对一个文件或者文件夹进行监听的时候,我们可以使用androidapi中的android.os.FileObserver,下面就来介绍如何使用。

注:onEvent()中的event是与0x40000000或上后的值,在操作之前最好与FileObserver.ALL_EVENTS按位与之后再判断。

1.如何实现一个FileObserver

首先extendsFileObserver然后覆盖其构造器,最后覆盖

onEvent(int event,String path)方法:

例子

public class MyFileObserver extends FileObserver {       /**        path 是所监听的文件夹或者文件名。       */        public MyFileObserver (String path) {           super(path);        }        @Override        public void onEvent(int event, String path) {        }     }



2.监听你所关心的事件:在onEvent(int event,String path)中,通过匹配event的值,可以捕获所发生的事件

例子:

public void onEvent(int event, String path) {       switch(event){           case android.os.FileObserver.ALL_EVENTS:              //所有事件 相当于default的功能              break;           case android.os.FileObserver.CREATE:              //文件被创建              break;           case android.os.FileObserver.OPEN :              //文件被打开              break;           case android.os.FileObserver.ACCESS:              //打开文件后,读文件内容操作              break;           case android.os.FileObserver.MODIFY:              //文件被修改              break;           case android.os.FileObserver.ATTRIB:              //未明操作              break;           case android.os.FileObserver.CLOSE_NOWRITE:              //没有编辑文件,关闭              break;           case android.os.FileObserver.CLOSE_WRITE:              //编辑完文件,关闭              break;           case android.os.FileObserver.DELETE:              //文件被删除              break;           case android.os.FileObserver.MOVED_FROM:              //文件被移动              break;                 }}



注意:在onEvent(int event,String path)中,path返回的是发生事件的文件名,并且不带路径,当我们在某个事件当中需要找到发生事件的文件就要结合它的路径才能找得到。

3.筛选监听事件,防止进入死循环

上面列出了FileObserver所能监听的大部分事件,但是在实际应用当中并不需要监听全部事件,只选择我们自己关心的事件来进行监听就可以,过多的事件监听会导致程序逻辑的混乱。

例如在监听文件被访问的操作时,打开这个文件

case android.os.FileObserver.ACCESS:              //打开文件后,读文件内容操作              File file = new File(filePath+File.separator+path);              String data = readFile(file);//读取文件内容操作           break;




当程序执行到readFile(file)时,onEvent()方法会再被触发,然后匹配到是ACCESS事件,又回到readFile(file)操作,结果导致死循环。

4.启用文件监听器.

在实现了自己的文件监听器后,下面介绍如何恰当得启用它。

MyFileObserver mObserver = new MyFileObserver("sdcard/myobserver/file");mObserver.startWatching();//启用文件监听器

取得文件监听器的对象,调用startWatching()开始监听。一开始我也以为就这么简单,后来在使用的时候,发现一旦在做批量任务的时候,文件监听器就不响应了。

所以这是后需要在逻辑处理模块添加线程:

public void onEvent(int event, String path) {    switch(event){           case android.os.FileObserver.CLOSE_WRITE:{              new Thread(){                  public void run(){                     //批量任务                  }              }.start();    }}



这样在新的文件发生改变或者新的文件被创建的时候,文件监听器仍然可以检测到。

5.停止。调用FileObserver中的stopWatching()就ok。

原文地址:点击打开链接

更多相关文章

  1. NPM 和webpack 的基础使用
  2. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  3. 读取android手机流量信息
  4. android 使用html5作布局文件: webview跟javascript交互
  5. Android(安卓)多媒体扫描过程(Android(安卓)Media Scanner Proces
  6. android“设置”里的版本号
  7. Android开发环境搭建
  8. Android(安卓)Resource介绍和使用
  9. 2014.01.21 ——— android 关联android-support源码

随机推荐

  1. Android设备获取默认的启用数据卡的SubId
  2. android适配器之基于BaseAdapt自定义简单
  3. 修改 android 手机 hosts 文件的方法
  4. Android(安卓)GridView 分页加载数据
  5. Android(安卓)总结外置 内置SD卡路径问题
  6. android 浮动按钮
  7. Android实现按下Back键程序隐藏到后台,而
  8. android listview的下拉加载
  9. mono for android 获取手机照片或拍照并
  10. android获取经纬度和地方名称(baidu api)