2011-06-19 19 views
1

私は以下の問題を抱えています:FileObserverが変更に反応しません

私の活動では、外部ファイルディレクトリの内容をリスト表示するリストビューがあります。 私はリストは、すぐに変更のいずれかの種類がコンテンツに発生するように更新することにしたいので、私は持っている:

私の活動

の内部クラスとして

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

メモ... lilの検索では、サブディレクトリを介して再帰的に表示されている変更についてドキュメントが間違っていることが明らかになりました。それらはターゲットディレクトリにのみ表示されます。 – DJC

答えて

0

DJCによると、fileobserverは再帰的ではありません。あなたがgoogleで良い検索をするなら、非常にうまく動作するRecursiveFileObserverクラスを見つけるでしょう。しかし、私がやったことの一つは、startWatchingメソッドのスレッドです。なぜなら、特に複雑なディレクトリツリーを設定することは永遠に必要なので、UIスレッドを束縛しないようにスレッド化することを勧めます。

2

もう1つ注意しなければならないのは、同じパスに対して複数のFileObserverインスタンスを作成することはサポートされていないため、競合状態が発生する可能性があることです。したがって、このコードが同じディレクトリに対して複数回呼び出される可能性がある場合は、問題が発生する可能性があります。

関連する問題