【发布时间】:2012-06-26 01:57:55
【问题描述】:
我已经尝试了一百种不同的方法来解决我的问题,但由于某种原因,它们根本行不通。 我正在尝试一种快速而肮脏的方式,以使我的应用程序持久化。它基本上得到了很多在销毁时需要保存的对象,所以我想我会让它把对象放入一个 ArrayList 中,然后使用 ObjectOutputStream 将 ArrayList 写入文件。
public void onStop() {
super.onStop();
Log.d("Event", "Stopped");
FileOutputStream fos = null;
ObjectOutputStream oos = null;
try {
fos = openFileOutput("Flights", MODE_WORLD_WRITEABLE);
oos = new ObjectOutputStream(fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
ArrayList<Flight> alFlightList = new ArrayList<Flight>();
Iterator it = flightMap.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pairs = (Map.Entry)it.next();
alFlightList.add((Flight) pairs.getValue());
}
try {
oos.writeObject(alFlightList);
oos.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
Log.d("Info", "File created!");
}
}
我得到了一个类似的算法来再次读取它,但它抱怨没有任何文件可供读取。 我知道使用文件进行持久性不是最佳实践,但正如前面提到的,这应该是一个快速而肮脏的解决方案。 (但我现在用在上面的时间,还不如花在制作数据库上。._。) 谢谢!
【问题讨论】:
-
onDestroy() 不能保证被调用。尝试进行一些登录以查看实际情况。更像是您希望将保存移动到 onPause() 或 onStop() 因为这些是应用程序变得可终止的点(取决于 android 版本 - 请参阅活动生命周期文档)。也有可能在您的测试中 onDestroy() 根本没有发生,因为没有必要销毁活动。当然,你的阅读算法应该处理没有什么可以恢复的情况,因为它可能是第一次运行。
-
我想过这个问题,并且一直在记录所有发生的事件,但即使它确实摧毁了很多次,它仍然没有工作。 (虽然移动它的想法是个好主意,一旦这个问题得到解决,我就会这样做。)
-
通过上面的代码添加额外的日志记录,这样你就知道它有多远了。您确定日志中已经没有错误了吗?另外,在 adb shell 中使用 run-as your.package.name 并手动检查文件是否存在。
-
您绝对不想在
onDestroy... 中执行 I/O,浏览此帖子的人会立即意识到这是问题所在。如果您已将此代码移出onDestroy,那么我建议您使用当前代码更新您的帖子。 -
正式注明,并更改。
标签: java android file fileoutputstream objectoutputstream