12

: これまで (9 月 6 日) に提供された 2 つの回答は興味深いものですが、残念ながら質問には対応していません。

私の Android テスト デバイスの 1 つに HTC One X があります。このデバイスは、バックグラウンド アプリケーションを頻繁に強制終了することで知られています (最も腹立たしいことに、ランチャーも含めて)。これは、おそらく HTC ブロートウェアが原因で、RAM 割り当てに関して限界に達しがちなためです。しかし、私の目的のためには、これは非常に役に立ちました。さまざまなメモリ不足の状況の影響を強調し、そのようなイベントに対処するためにアプリケーションを改善できるからです。たとえば、私が学んだことの 1 つは、バックスタックが保持されていても、Applicationインスタンスやその他のstaticリソースを強制終了できるということです。Activityしたがって、優れたユーザー エクスペリエンスを提供するために、アプリケーションを実行している単一のプロセスであっても、バックスタックを残すことができます。staticそれは保持されています。このため、私のアプリケーションは、状態を適切にチェックし、必要に応じて再初期化を実行するという点で非常に頑丈になりましたActivity

私の特定の質問に移ると、コード検査を通じて、staticあるクラスのメンバーが強制終了され、その後再初期化されたことが原因であると思われるまれな症状が見られましたが、別の静的リソースのいずれかライブラリ クラスが再初期化されていません。2 つの別個のリソース間のこのような依存関係はstatic、私の側の悪い設計を表していることを認識しており、これを回避するためにリファクタリングします。ただし、私の分析が正しいかどうかを知りたいです。つまり、バックスタックが保持されているが、特にライブラリ/パッケージごとに、一部のリソースのみが強制終了されているという状況は可能ですか? static

編集 1関連する 2 つのクラスについてもう少し詳しく説明します。

クラス 1 は、 と呼ぶクラスControllerです。シングルトンとしては使用されませんが、すべてのインスタンスで共通のデータが含まれていますstatic Map。次のように初期化されます。

private static Map<String, String> sSomeMetaData;

static {
    sSomeMetaData = new HashMap<String, String>();
}

次に、 というクラスがありMyFlyweightFactoryます。このクラスは別のライブラリにあります。このクラスはシングルトンです:

private static MyFlyweightFactory instance = new MyFlyweightFactory();

public static synchronized MyFlyweightFactory getInstance(){
    return instance;
}   

private MyFlyweightFactory(){ }

TreeMap<String, MyParserRenderer> images = new TreeMap<String, MyParserRenderer>(); 

さて、ここに依存関係があります。ファクトリ クラスには、ファイル システムからファイルを解析することによって構築される特定の名前付きイメージ オブジェクトを取得する getter メソッドがあります。工場出荷時の初期化以降、工場がその画像を要求されていない場合、工場はファイルからそれを解析します (実際には私の SVG 画像パーサー ライブラリです)。画像はオブジェクトに解析されMyParserRendererます。この画像の解析が行われると、ファクトリはControllerクラスのsSomeMetaDataメンバーにもいくつかのデータを取り込みます。工場が保持しているすべての画像は、上に表示されているimagesメンバーに保持されTreeMapます。staticしたがって、これらのイメージはシングルトン ファクトリ インスタンスの非静的メンバーです。

まれな問題の状況は、 findからいくつかのオブジェクトを提供したことを知っていても、空であるControllerfindのインスタンスのようです。これは確かに のインスタンスが残っていて、画像オブジェクトを再解析する必要がなかった場合にのみ発生する可能性があります (つまり、二度と読み込まれないことを意味します) 再度実行。コードの他の場所で編集されていないことを確認できます。sSomeMetaDataMyFlyweightFactoryMapMyFlyweightFactorysSomeMetaDatastaticControllersSomeMetaDataclear()

4

2 に答える 2

3

これを見てください:アクティビティのライフサイクル。

ここに画像の説明を入力

メモリが不足すると、一時停止されたアクティビティが強制終了され、メモリが解放されます。

したがって、アクティビティを再作成する必要があるすべての状況で、これを考慮して説明する必要があるのはなぜですか。

これはアプリ全体ではなく、アクティビティ ベースです。そのため、それほど重要ではないと感じる活動を殺し始めます。同じアプリ内で、一部のアクティビティが影響を受ける場合と影響を受けない場合があります。

上記の表の「強制終了可能」列に注意してください。強制終了可能とマークされているメソッドの場合、そのメソッドがアクティビティをホストしているプロセスを返した後、そのコードの別の行が実行されることなく、いつでもシステムによって強制終了される可能性があります。このため、onPause() メソッドを使用して永続データ (ユーザー編集など) をストレージに書き込む必要があります。さらに、メソッド onSaveInstanceState(Bundle) は、アクティビティをそのようなバックグラウンド状態にする前に呼び出されます。これにより、アクティビティ内の動的なインスタンスの状態を指定されたバンドルに保存し、アクティビティが後で onCreate(Bundle) で受け取ることができます。再作成する必要があります。プロセスのライフサイクルがホストしているアクティビティにどのように結び付けられているかについての詳細は、「プロセスのライフサイクル」セクションを参照してください。

于 2012-09-06T11:33:06.697 に答える
1

アプリケーションの問題をデバッグまたはトレースする際に、何らかの形で間違った方向に進んでいると思います。

これが私があなたに言えることであり、あなたが間違って理解していると私が思うことです:

Androidリソースが必要なためにアプリケーションが破棄されると、Applicationクラスも「破棄/停止」されてbackstack保持されます。アプリケーションを再起動すると、特定Applicationのクラスが「再作成」され (onCreate()が呼び出されます)、Activityバックスタックも再作成されます。これはActivity、ユーザーに最後に表示されたものが再作成されることを意味します。 -作成した。したがって、基本的に、アプリケーションで何が起こるかは、期待される動作です。ライブラリ内の一部のメンバーが再初期化されないのはなぜですか...わかりません。

ここでも同様の質問がありました:アプリケーションの再起動 - アクティビティのエントリ ポイント

于 2012-09-06T12:06:02.203 に答える