有人可以帮我这个吗?
我想观察一个文件,看它是否被修改,以便我可以更新活动。经过几次测试,我确定它显然不起作用。 我做错了吗?
我正在创建一个带有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();
非常感谢任何帮助。
答案 0 :(得分:2)
' public abstract void onEvent(int event,String path)“ -
在特殊的FileObserver线程上调用此方法。它运行 独立于任何线程,所以要小心使用适当的 同步!考虑使用post(Runnable)来转移事件处理 工作到主线程以避免并发问题。
http://developer.android.com/reference/android/os/FileObserver.html
如果你把toast通过handler.post(new Runnable(){...}),那应该可行。
答案 1 :(得分:1)
假设你的文件没有(总是)存在,你应该把你的观察者放在文件夹上,如下所示:
Context ctx = ...;
File filesFolder = ctx.getFilesDir();
请注意,这也将确保将创建filesFolder
目录。
现在,只要使用Context#.openFileOutput(..)
编写,删除或更新文件,您的观察者就会收到通知 - 您可以在FileObserver
中过滤文件名,例如“quest”。