14

(ガベージ コレクターはオブジェクトのみを収集するため、タイトルは誤解を招きますが、このタイトルの方がわかりやすいと思います)

Global という名前のクラス (初期化時には null) 内に "userid" という名前の静的変数を持つ Android アプリケーションがあるとします。

Android アプリケーションのライフサイクル中に "userid" 変数を何らかの値に設定すると、Global.userid = "myid" など、Android アプリケーションがまだ生きている間にこの変数が null になる可能性はありますか?

つまり、Android アプリケーション全体を強制終了することなく、メモリ不足の問題により、Android VM が Global クラスをアンロードし、このグローバルな静的変数を「強制終了」することは可能ですか?

アプリケーションの実行中に(メモリ不足の問題により)useridが突然nullになり、アプリケーション全体がクラッシュする状況が心配です。

編集 私はいくつかの概念を誤解していました(申請プロセスと活動の間)。すべての回答に感謝します!

4

2 に答える 2

23

Android アプリケーションのライフサイクル中に "userid" 変数を何らかの値に設定すると、Global.userid = "myid" など、Android アプリケーションがまだ生きている間にこの変数が null になる可能性はありますか?

自分で設定する場合はnull、はい。

言い換えれば、Android アプリケーション全体を強制終了することなく、メモリ不足の問題により、Android VM が Global クラスをアンロードし、このグローバルな静的変数を「強制終了」することは可能ですか?

通常の場合、いいえ。

カスタム クラスローダーをいじってみると、クラスがアンロードされるシナリオが考えられます (そのため、それらの静的データ メンバーはすべてpoofになります)。このシナリオについての議論があったことを思い出すようですが、結論。ただし、カスタム クラスローダーをいじるアプリはほとんどありません

アプリケーションの実行中に(メモリ不足の問題により)useridが突然nullになり、アプリケーション全体がクラッシュする状況が心配です。

そんなことはあってはなりません。

ユーザーがアプリを使用しているときに、HOME (または通知、着信、最近のタスク リストなど) を介してアプリを離れ、その後、最近のタスク リストを介してアプリに戻ることが考えられます。 . プロセスがフォアグラウンドにない間にプロセスが終了した場合、静的データ メンバーはnull、アクティビティが最近のタスク リストから開始されたときになります。ユーザーが戻るアクティビティが必ずしもランチャー アクティビティであるとは限らないnullため、プロセスが終了して再起動されたことが原因であったとしても、静的データ メンバーが自発的に になったかのようにアプリが動作する場合があります。

これは、静的データ メンバーを慎重に使用する必要があるいくつかの理由の 1 つです。

于 2013-11-06T23:16:04.557 に答える