私は最初のAndroidアプリを開発中です。このモデルには、ユーザーが更新を行ったときにデータベースに保持されるモデルがあります。onSaveInstanceState/onPause - プロセスが終了する前に状態が完全に保存されるまで待つ
onSaveInsanceState
が呼び出されたとき、ユーザーがデータベースから作業していたドキュメントをロードするために使用できるIDを保存します。しかし、これは、文書が完全にデータベースにヒットした後にのみ発生する可能性があります。いくつかのケースでは、複雑な文書を永続化するのに数秒かかることがあります(私はすべての冗長なログアウトを取るとスピードアップすることを望んでいます。実際には複雑な文書が段階的に構築されます)。データベースに永続化されるため、複雑な文書をすべて一度に保存する必要はありません)。
Androidでのスレッドの#1ルールは「UIスレッドをブロックしない」ため、DBのやりとりは別のスレッドで行われます。しかし、Androidライフサイクルの理解は、多くの場合、Androidシステムがプロセスを強制終了したいので、onSaveInstanceStateが呼び出されているということです。これは、DBスレッドが文書の保存を完了するまでこのメソッドを返すことができないことを示唆しています(実際には私の現在の設計では、DBに保存されるまで文書のID番号は実際にはわかりませんが、私は保存された状態の束にそれを置くこともできません)。
永続化タスクが完了するのを待っているUIスレッドをブロックすることは適切ですか?プロセスが強制終了されたためにonSaveInstanceState
が呼び出されると、アプリケーションはフォアグラウンドで表示されなくなるため、応答しなくなるインターフェイスはありません。
ただし、onSaveInstanceState
は、画面の向きが変更されたときに発生する設定の更新によってアクティビティインスタンスがゴミ箱に移動しているときにも呼び出されます。画面を横向きに回転させて数秒間何もしないと、非常に残念です。この場合、プロセス(とメモリ空間)はまだ残っていますので、IDの代わりにBundleへの参照を保存するだけでドキュメントがデータベースに確実にアクセスするようにする必要はありません。しかし、私はこれらの2つのケースの違いを伝える方法を知らない。
このような状況では、慣例がありますか?スレッドを安全にブロックするだけでいいですか?ブロックして待機するために通常のJavaスレッドプリミティブを使用できますか?何かできることはありますかはスレッドをブロックしませんが、Androidがプロセスを終了する前に永続タスクが完了するようにしますか?
の場合は、onSaveInstanceState
が必ずしも呼び出されるとは限りません。
私は、AsyncTaskのポイントはUIスレッドをブロックしないと思っていましたか?長持ちする操作をするためにそれを使用することの全体的なポイントではありませんか? – Ben
Configの変更に問題がある場合は心配しないでください。このアクティビティタグのmainfestファイルにあるconfigChangesを書き留めておけば、オリエンテーションが変更されたときにonSaveInstanceState()を呼び出すことはありません。それは活動を再開させることはない –
それは便利です(しかし、それ自身の問題を抱えています)。しかし、問題が完全に無関係です。これは、保存がバックグラウンドによって行われた場合にアプリケーションが終了したときに、糸。 – Ben