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