2011-06-19 44 views
1

我遇到以下问题:FileObserver不会对变化做出反应

在我的Activity中,我有一个列表视图,列出了外部文件目录的内容。 我想任何一种变化中的内容发生尽快更新列表,所以我必须:

public class FileAdapter implements ListAdapter { 
    private File mDirectory; 
    private FileObserver mFileObserver; 
    private DataSetObservable mDataSetObservable; 

    public FileAdapter() { 
    super(); 
    this.mDirectory = 
     new ContextWrapper(ImportList.this).getExternalFilesDir(null); 
     if (this.mDirectory != null) { 
      this.mFileObserver = 
       new FileObserver(this.mDirectory.getAbsolutePath()) { 
        @Override 
        public void onEvent(int event, String path) { 
         new Handler().post(new Runnable() { 
          public void run() { 
           FileAdapter.this.mDataSetObservable.notifyChanged(); 
          } 
         }); 
        } 
       }; 
     } 
     this.mDataSetObservable = new DataSetObservable(); 
    } 
    public void startWatching() { 
     this.mFileObserver.startWatching(); 
    } 

    public void stopWatching() { 
     this.mFileObserver.stopWatching(); 
    } 

    public boolean areAllItemsEnabled() { 
     return true; 
    } 

    public boolean isEnabled(int position) { 
     return true; 
    } 

    public int getCount() { 
     return this.mDirectory == null ? 0 : this.mDirectory.listFiles().length; 
    } 

    public Object getItem(int arg0) { 
     return this.mDirectory.listFiles()[arg0]; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public int getItemViewType(int position) { 
     return 0; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     ItemView itemView; 
     if (convertView == null) { 
      itemView = new ItemView(ImportList.this, 1); 
     } else { 
      itemView = (ItemView) convertView; 
     } 
     File file = (File) this.getItem(position); 
     itemView.setValue(0, file.getName()); 
     return itemView; 
    } 

    public int getViewTypeCount() { 
     return 1; 
    } 

    public boolean hasStableIds() { 
     return false; 
    } 

    public boolean isEmpty() { 
     return this.getCount() < 1; 
    } 

    public void registerDataSetObserver(DataSetObserver observer) { 
     this.mDataSetObservable.registerObserver(observer); 
    } 

    public void unregisterDataSetObserver(DataSetObserver observer) { 
     this.mDataSetObservable.unregisterObserver(observer); 
    } 

    public String getPath() { 
     return this.mDirectory == null ? 
      ImportList.this.getResources().getString(R.string.no_external_files) : 
      this.mDirectory.getAbsolutePath(); 
    } 
} 

作为一个内部类我的活动

,并以我的onCreate我做的:

this.mFileBrowser = (ListView) this.findViewById(R.id.listview_filebrowser); 
.... 
this.mFileAdapter = new FileAdapter(); 
this.mFileBrowser.setAdapter(this.mFileAdapter); 

而在的onResume()我做的:

this.mFileAdapter.startWatching(); 

所以,按照我的理解,这应该例如,一旦从外部文件目录中删除一个文件,就会导致我的ListView自动重新加载。 但它不起作用!

+1

有一点需要注意......文件查找显示文档对于通过子目录递归查看的更改是不正确的..他们只能在目标目录中看到。 – DJC

回答

0

正如DJC所说,fileobserver不是递归的。如果你在google上进行了很好的搜索,你会发现一个很好的RecursiveFileObserver类。然而,我对它做的一件事是线程startWatching方法,因为它需要永远设置,特别是对于复杂的目录树,所以我建议将它线程化,以便不绑定UI线程。

2

另一件需要注意的事情是,不支持为同一路径创建多个FileObserver实例,并可能导致一些竞争条件。所以如果有可能这个代码可能被多次调用同一个目录,你可能会遇到问题。

相关问题