【问题标题】:Android FileObserver onEvent not getting calledAndroid FileObserver onEvent没有被调用
【发布时间】:2012-11-25 00:05:15
【问题描述】:

有人可以帮我解决这个问题吗?

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

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

任何帮助将不胜感激。

【问题讨论】:

  • 你需要一个完整的路径,而不仅仅是文件名; “任务” - 或者这是您在粘贴代码示例时刚刚编辑的内容?此外,当您开始观察时,文件或文件夹需要存在。

标签: java android fileobserver


【解决方案1】:

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

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

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

如果您通过 handler.post(new Runnable(){...}) 将 toast 放入,那应该可以。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我已经编辑了我的代码,上面......它仍然没有触发 onEvent 方法。我能够验证我正在写入和读取文件。我在想我没有从 filesFolder 对象中正确获取路径。但我认为这是对的。 (此时我对文件做的很少)
    • 这不是 FileObserver 故障 - 你正试图在 onEvent 内创建一个 Toast 我注意到 - 这不起作用,因为 FileObserver 在单独的线程(并且应该在 UI 线程上创建 Toasts)。如果您需要Toasts,您应该创建一个Handler 并发布您想要显示的任何信息。
    • Toast 只是为了让我看看它是否有效。我把它删了再试,日志功能还是没有生效。
    • 没关系...我尝试使用 fileFolder.getName()。但它适用于 fileFolder.getPath()。非常感谢您的帮助!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 2019-09-02
    相关资源
    最近更新 更多