3

有人可以帮助我吗?

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

我正在创建一个带有 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();

任何帮助将不胜感激。

4

2 回答 2

2

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

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

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

如果您将吐司放入 handler.post(new Runnable(){...}) 中,那应该可以。

于 2013-06-21T11:31:05.640 回答
1

假设您的文件不(总是)存在,您可能应该将您的观察者放在文件夹中,如下所示:

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

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

现在,每当使用例如写入、删除或更新文件时,您的观察者都会收到通知- 您可以在您的示例“quest”中Context#.openFileOutput(..)过滤您的文件名。FileObserver

于 2012-11-25T00:39:03.087 回答