首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android FileObserver onEvent未被调用

Android FileObserver onEvent未被调用
EN

Stack Overflow用户
提问于 2012-11-25 08:05:15
回答 2查看 6.4K关注 0票数 3

有没有人能帮我这个忙?

我想观察一个文件,看看它是否被修改,这样我就可以更新活动了。经过几次测试后,我发现它根本不能工作。我做错了什么吗?

我正在创建一个onEvent方法的FileObserver,用来显示Toast和日志数据,看看它是否正常工作,但是onEvent从未被调用过。我在现有文件和新文件中都尝试过,但似乎在这两种情况下都不起作用。

代码语言:javascript
复制
    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();

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-25 08:39:03

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

代码语言:javascript
复制
Context ctx = ...;
File filesFolder = ctx.getFilesDir();

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

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

票数 1
EN

Stack Overflow用户

发布于 2013-06-21 19:31:06

公共抽象空onEvent (整型事件,字符串路径)“-

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

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

如果您通过一个handler.post(new Runnable(){...})来执行toast,那么它应该可以工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13546958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档