Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android FileObserver OneEvent未被调用_Java_Android_Fileobserver - Fatal编程技术网

Java Android FileObserver OneEvent未被调用

Java Android FileObserver OneEvent未被调用,java,android,fileobserver,Java,Android,Fileobserver,有人能帮我吗 我想观察一个文件,看看它是否被修改,以便更新活动。经过几次测试,我确定它显然不起作用。 我做错什么了吗 我正在使用OneEvent方法创建一个FileObserver来显示Toast和日志数据,只是为了查看它是否工作,但是OneEvent永远不会被调用。 我用一个现有文件和一个新文件都试过了,但在这两种情况下都不起作用 Context context = this; File fileFolder = context.getFilesDir(); Stri

有人能帮我吗

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

我正在使用OneEvent方法创建一个FileObserver来显示Toast和日志数据,只是为了查看它是否工作,但是OneEvent永远不会被调用。 我用一个现有文件和一个新文件都试过了,但在这两种情况下都不起作用

    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();

任何帮助都将不胜感激。

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

Context ctx = ...;
File filesFolder = ctx.getFilesDir();
请注意,这还将确保创建
filesFolder
目录


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

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


如果您通过handler.post(new Runnable(){…})来放置toast,应该可以使用。

您需要一个完整的路径,而不仅仅是文件名“-或者这是您粘贴代码示例时刚刚编辑的内容?此外,当您开始观察文件或文件夹时,它需要存在。我已经编辑了上面的代码。。。。它仍然没有启动OneEvent方法。我能够验证我正在写入和读取文件。我想我没有从FileFolder对象正确获取路径。但我认为这是对的。(目前我对文件做的很少)这不是
FileObserver
出现故障-您正试图在
onEvent
中创建
Toast
,我注意到-这不起作用,因为
FileObserver
在单独的线程中运行(并且
Toast
应该在UI线程上创建). 如果你需要
土司
s,你应该制作一个
处理程序
,然后发布你想显示的任何信息。土司只是为了让我看看它是否有效。我删除了它并再次尝试,但日志函数仍然没有生效。不管怎样。。。我使用fileFolder.getName()尝试了它。但它适用于fileFolder.getPath()。非常感谢你的帮助!!