java - Android FileObserver onEvent 没有被调用

标签 java android fileobserver

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

我想观察一个文件,看看它是否被修改,以便我可以更新 Activity 。经过多次测试,我确定它根本无法正常工作。 我做错了什么吗?

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

如有任何帮助,我们将不胜感激。

最佳答案

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

This method is invoked on a special FileObserver thread. It runs independently of any threads, so take care to use appropriate synchronization! Consider using post(Runnable) to shift event handling work to the main thread to avoid concurrency problems.

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

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

关于java - Android FileObserver onEvent 没有被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13546958/

相关文章:

android - 为什么我的 SoundPool 是静音的?

android - FIleObserver 和 ContentObserver 在 Android Marshmallow 中不起作用

android - 在 Android 内容观察器中观察 Audio.Media.EXTERNAL_CONTENT_URI 的变化

android 我们的 Activity 在堆栈中会存在多长时间

java - com.google.gson.JsonSyntaxException : java. lang.IllegalStateException:预期为 BEGIN_OBJECT,但实际为 STRING

java - 将 Map<List<Long>,List<Long>> 转换为字符串并返回

java - 如何在 JVM 级别捕获 OutOfMemory 错误?

java - Grails 1.3.3 过滤器 - NullPointerException 或 ClassCastException

java - 将属性转换为输入流?