0

在我的应用程序中,我使用 XML 来存储用户在画布上绘制的图像。绘制完每个图形后,我将点写入 xml 文件并将其存储在磁盘中。xml相当大。所以在写完之前需要一段时间。这是我为此使用的代码。

private void  writeToXml( final Book book)
    {

        Thread t = new Thread() {
            @Override
            public void run() {
                try {
                    Serializer serializer = new Persister();
                    File result = new File(android.os.Environment.getExternalStorageDirectory() + "/MyBooks/Book.xml");

                    try {

                            serializer.write(book, result);


                    } catch (Exception e1) {
                        e1.printStackTrace();
                    }
                } finally {
                    //updateBook();
                }
            }
        };
        t.start();

    }

我的问题是,如果用户在写入完成之前退出应用程序,XML 文件将被损坏。我怎样才能更好地做到这一点。我如何确保即使应用程序关闭,文件也会被正确写入?

谢谢

4

2 回答 2

2

我的问题是,如果用户在写入完成之前退出应用程序,XML 文件将被损坏。

这在一定程度上取决于您对“退出应用程序”的定义。

按 HOME、按 BACK 退出您的活动以及类似的事情不应阻止您现有的线程运行到完成,假设它将在一两秒钟内完成。如果您在此处收到损坏的结果,则应确保Book在保存实例时没有弄乱您的实例。

如果“写入完成之前需要一段时间”将花费超过一两秒,那么 Android 可能会在写入完成之前终止您的进程。损坏是因为您的磁盘写入代码似乎正在写入真实文件,并且应该只在您第一次使用该文件时完成。第二次及以后的保存应先写入临时文件,然后重命名为真实文件。这将避免损坏,尽管保存实际上不会发生。

为了使这更加可靠,请使用 anIntentService而不是线程,因为这将向 Android 表明您仍在工作,并且应该给您多几秒钟的不间断时间。

如果“写入完成需要一段时间”超过 15 秒,现在您必须考虑设备在磁盘 I/O 完成之前进入睡眠状态的可能性。为了解决这个问题,请使用我WakefulIntentService的或 Android 支持包的WakefulBroadcastReceiver.

请记住,如果用户通过单击设置中的强制停止“退出应用程序”,您的进程将立即终止。还有其他灾难,比如设备没电了,可能会发生。这就是为什么您需要确保先写入临时文件,以减少此类事件损坏数据的可能性。

于 2013-09-20T11:07:59.277 回答
0

您可以writeToXml()在普通线程中添加对函数的调用。这将确保即使在应用程序被最小化或关闭后,线程也将完成其任务,然后才终止。

您可以在其中启动另一个线程。它看起来像这样:

    //Inner thread
Thread t2=new Thread(new Runnable() {
    public void run()
    {
            writeToXml(book);
}); t2.start(); 
于 2013-09-20T10:57:35.217 回答