我一直在尝试一百种不同的方法来解决我的问题,但由于某种原因,它们简单无法运作。 我正在尝试快速而肮脏的方式,因为我的应用程序是持久的。它基本上在销毁时需要保存很多对象,所以我想我会把它放到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!");
}
}
我有一个类似的算法再次读出它,但它抱怨没有任何文件可供阅读。 我知道使用文件进行持久化并不是最好的做法,但这就像前面提到的那样,应该是一个快速而肮脏的解决方案。 (但是我现在使用它的时间,也可能花在制作数据库上。。)。 谢谢!
答案 0 :(得分:1)
来自Saving Persistent State的文档,
通常有两种持久状态而不是活动状态 将处理:共享文档类数据(通常存储在 SQLite数据库使用内容提供者)和内部状态如 用户偏好。
对于内容提供商数据,我们建议活动使用“编辑” 放置“用户模型。即,用户进行的任何编辑都是有效的 立即制作,无需额外的确认步骤。 支持这种模式通常只需遵循以下两个方面 规则:
创建新文档时,支持数据库条目或文件 它是立即创建的。例如,如果用户选择写一个 新的电子邮件,一旦他们创建了该电子邮件的新条目 开始输入数据,以便在之后进行任何其他活动 此时此电子邮件现在将显示在草稿列表中。当一个 调用activity的onPause()方法,它应该提交支持 内容提供者或文件用户所做的任何更改。这确保了 这些变化将被任何其他活动所见 跑。您可能希望更积极地提交数据 在活动生命周期的关键时刻:例如之前 在完成自己的活动之前,开始一项新的活动 用户在输入字段等之间切换
因此,如果您想“正确”地执行此操作,我会将数据保存在onPause
...并且我可能会使用某种类型的SQLite数据库来保存状态。您还应该使用AsyncTask
在单独的线程上执行文件I / O,因为这类事情可能会阻止UI线程并使您的应用程序崩溃。
如果你想要一个快速而肮脏的方式(即如果你没有在Android市场上发布这个应用程序),那么我打赌问题是你正在尝试执行onDestroy
中的文件I / O,不保证被调用。这是在onPause
中执行文件读/写的另一个原因。
我建议的最后一件事是阅读internal/external storage上的文档。可能是您没有写入正确的目录,因为您没有这样做的文件权限。您应该像这样执行文件I / O:
String FILENAME = "FLIGHTS";
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(...);
fos.close();
答案 1 :(得分:0)
在/ sdcard / Flights中替换Flight,否则它会在null空间中创建一个文件。 :) 我不确定它是否有用。
答案 2 :(得分:0)
为什么不使用数据库?在创建或重新启动应用程序时,从数据库中回调所有设置?
您还可以使用onpause()或onstop()方法将所有数据存储到数据库中。