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 を押したり、同様のことを行っても、既存のスレッドの実行が 1 秒か 2 秒で完了すると仮定すると、実行が妨げられることはありません。Bookここで破損した結果が得られた場合は、保存中にインスタンスをいじっていないことを確認する必要があります。

「書き込みが完了するまでにしばらく時間がかかります」が 1 ~ 2 秒以上かかる場合は、書き込みが完了する前に Android がプロセスを終了している可能性があります。破損は、ディスク書き込みコードが実際のファイルに書き込んでいるように見えるためです。これは、そのファイルを初めて使用するときにのみ行う必要があります。2 回目以降の保存は、一時ファイルに書き込んでから実ファイルにリネームしてください。これにより、破損は回避されますが、保存は事実上行われません。

これをさらに信頼できるものにするIntentServiceには、スレッドの代わりに を使用します。これにより、まだ作業中であることが Android に示され、中断されない時間がさらに数秒与えられるはずです。

「書き込みが完了するまでに時間がかかる」が 15 秒を超える場合は、ディスク I/O が完了する前にデバイスがスリープ状態になる可能性を考慮する必要があります。これに対抗するには、 myWakefulIntentServiceまたは 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 に答える