0

プライベート静的フィールドを持つアクティビティがあります。そして、画面をめくると、その静的フィールドはnullに設定されます。もちろん、Androidはプロセスを強制終了すると推測されますが、そうではないと確信しています。しかし、最初から始めましょう。

1つのスレッドからのみ関数を呼び出すことができるJNIライブラリがあります。Javaからは、ライブラリ関数はオブジェクトのネイティブメソッドとして表示されます(ちなみに、そのオブジェクトのインスタンスは1つだけ意味があり、静的構造を持つライブラリのインスタンスは1つだけです)。ライブラリオブジェクトは、読み取り/書き込みアクセスロックを提供するJavaレイヤーであるラッパーを介して使用されます。アクティビティには、ラップされたライブラリオブジェクトを参照するプライベート静的フィールドがあります。ライブラリは、別のスレッドで長い操作を実行します。

シングルトンの作成は次のようになりました。すべてのアクティビティは同じUIスレッドで作成されるため、onCreate()で、フィールドがnullかどうかを確認し、nullの場合は、ラップされたライブラリオブジェクトを作成しました。問題はありませんでした-少なくともAndroid2.xでは。

Android 4では、次のようになります。長い操作を開始して画面を回転させます。アクティビティが再作成され、onCreate()のsavedInstanceStateパラメーターはnullではありませんが、そのプライベート静的フィールドnullです。これで、新しいライブラリオブジェクトが作成され、新しい読み取り/書き込みロックを使用して新しいラッパーが作成され、ライブラリ操作が呼び出されます...もちろん、ライブラリは、画面を表示する前に開始されたリクエストでまだビジーです。新しい読み取り/書き込みロックは古いライブラリを保護せず、データが破損し、すべてがクラッシュします。

これに対する解決策は、参照を静的フィールドとしてではなく、アプリケーションのインスタンスフィールドとして保持することであると聞いています。

さて、問題は次のとおりです。

なぜ? 一体何が起こっているのですか? すべてのシングルトンを書き直す必要がありますか?

4

0 に答える 0