Android FileObserver onEvent未被调用

时间:2012-11-25 00:05:15

标签: java android fileobserver

有人可以帮我这个吗?

我想观察一个文件,看它是否被修改,以便我可以更新活动。经过几次测试,我确定它显然不起作用。 我做错了吗?

我正在创建一个带有onEvent方法的FileObserver来显示Toast并记录数据,以查看它是否正常工作,但onEvent永远不会被调用。 我已经用现有文件和新文件尝试了它,但它似乎在两种情况下都不起作用。

    Context context = this;
    File fileFolder = context.getFilesDir();

    String fileName = "quest";
    FileObserver questObserver = new FileObserver(fileFolder.getPath()) { // also tried fileFolder.getName()
        @Override
        public void onEvent(int event, String path) {
            Toast.makeText(getApplicationContext(), "onEvent fired", Toast.LENGTH_LONG).show();
            Log.d(TAG, "FileObserver().onEvent");
        }
    };
    questObserver.startWatching();

    /* create file */
    ObjectOutputStream objectOut = null;
    try {
        FileOutputStream fileOut = context.openFileOutput(fileName, Context.MODE_PRIVATE);
        objectOut = new ObjectOutputStream(fileOut);
        objectOut.writeObject(new Quest());
        fileOut.getFD().sync();
    } catch (IOException e) {
        Log.d(TAG, e.getMessage());
    } finally {
        if (objectOut != null) {
            try {
                objectOut.close();
            } catch (IOException e) {
                Log.d(TAG, e.getMessage());
            }
        }
    }

    /* read file */
    ObjectInputStream objectIn = null;
    Quest quest = null;

     try {
         FileInputStream fileIn = context.openFileInput(fileName);
         objectIn = new ObjectInputStream(fileIn);
         quest = (Quest) objectIn.readObject();
     } catch (FileNotFoundException e) {
         // Do nothing
     } catch (IOException e) {
         e.printStackTrace();
     } catch (ClassNotFoundException e) {
         e.printStackTrace();
     } finally {
         if (objectIn != null) {
             try {
                 objectIn.close();
             } catch (IOException e) {
                 Log.d(TAG, e.getMessage());
             }
         }
     }
     Toast.makeText(context, quest.getTitle(), Toast.LENGTH_LONG).show();

    questObserver.stopWatching();

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

' public abstract void onEvent(int event,String path)“ -

  

在特殊的FileObserver线程上调用此方法。它运行   独立于任何线程,所以要小心使用适当的   同步!考虑使用post(Runnable)来转移事件处理   工作到主线程以避免并发问题。

http://developer.android.com/reference/android/os/FileObserver.html

如果你把toast通过handler.post(new Runnable(){...}),那应该可行。

答案 1 :(得分:1)

假设你的文件没有(总是)存在,你应该把你的观察者放在文件夹上,如下所示:

Context ctx = ...;
File filesFolder = ctx.getFilesDir();

请注意,这也将确保将创建filesFolder目录。

现在,只要使用Context#.openFileOutput(..)编写,删除或更新文件,您的观察者就会收到通知 - 您可以在FileObserver中过滤文件名,例如“quest”。