4

Android でこの構造に何か問題がありますか?

class A extends Activity {

private Object myObject = new Object();

@Override
protected void onCreate(Bundle savedInstanceState) {
    //myObject = new Object();
}

}

myObjectがnullであるため、後である時点で(まだ再現できない場合もあります)例外が発生するためです。onCreateで初期化する必要があるためかどうかはわかりません。

編集:追加の詳細:

  • myObject の実際のクラスはList<Object>(Object はドメイン固有の型です)

  • アクティビティの後のある時点で、myObject を「パラメータ パサー」クラスの静的フィールドとして保存し、他のアクティビティを開始します (Parcelable の実装を避けているためです。これが良いか悪いかのプラクティスについては、ここでは説明しません。それが私のエラーの原因でない限り)。他のアクティビティでは、myObject をピックアップします。それは(時々)nullです。

編集 2 : このオブジェクトへの参照をパラメーター パサー クラス (スタンドアロンの専用クラス) の静的フィールドとして格納している場合、このオブジェクトが null になる理由がわかりません。それがガベージ コレクションのしくみです。オブジェクトが参照されなくなったときに削除するだけです。したがって、静的参照があるため、このオブジェクトを削除しないでください。この考えによれば、それらが正しければ、問題は別の場所にあるはずです。

4

3 に答える 3

2

新しいアクティビティを開始すると、古いアクティビティは可能なガベージ コレクション (パラメータ パッサー クラスを含む、その中でインスタンス化されたクラスを含む) のためにブロックに移動するため、オブジェクトが必ずしも利用可能になるとは限りません (断続的な失敗。)。

2 つのオプションが表示されます。

1) 新しいアクティビティを開始するインテントをバンドルに入れて渡します。これを回避しようとしていたため、おそらく最善の選択ではありません。

2) Application クラスを拡張し、そこにオブジェクトを格納します。

編集

このSO Questionに対する受け入れられた回答が問題を解決する可能性があると思います(そして実際に何が起こっているのかを説明します)。

于 2012-06-22T14:11:59.770 に答える
1

いいえ、そのコードは問題ありません。コンストラクターでオブジェクトを作成できます。

于 2012-06-22T13:41:27.963 に答える
0

Java でのインスタンス変数の初期化に関する以前の質問とセクション3.2.4 を確認することをお勧めします。基本的に最初のケースを述べているフィールドのデフォルトとイニシャライザ:

private Object myObject = new Object();

クラス コンストラクターでの初期化と同じです。(注意 onCreate はコンストラクターではありません)。

そのため、「new Object()」命令が失敗して例外が生成された場合を除き、myObjectをnullにすることはできません。

コードの後半で myObject の内容を変更している可能性はありませんか?

于 2012-06-22T14:27:39.253 に答える