有没有人能帮我这个忙?
我想观察一个文件,看看它是否被修改,这样我就可以更新活动了。经过几次测试后,我发现它根本不能工作。我做错了什么吗?
我正在创建一个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();任何帮助都将不胜感激。
发布于 2012-11-25 08:39:03
假设您的文件并不(总是)存在,您可能应该将您的观察者放在files文件夹上,如下所示:
Context ctx = ...;
File filesFolder = ctx.getFilesDir();请注意,这还将确保创建filesFolder目录。
你的观察者现在会在文件被写入、删除或更新时收到通知,例如使用Context#.openFileOutput(..) --你可以在你的FileObserver中过滤文件名,在你的例子"quest“中。
发布于 2013-06-21 19:31:06
‘公共抽象空onEvent (整型事件,字符串路径)“-
此方法在一个特殊的FileObserver线程上调用。它独立于任何线程运行,所以要注意使用适当的同步!考虑使用post(Runnable)将事件处理工作转移到主线程,以避免并发问题。
http://developer.android.com/reference/android/os/FileObserver.html
如果您通过一个handler.post(new Runnable(){...})来执行toast,那么它应该可以工作。
https://stackoverflow.com/questions/13546958
复制相似问题