11

私はアプリを作成しましたが、リリース後、一部のユーザーが厄介なバグを経験しているようです。単純に再現できないもの。

これには3つのアクティビティが含まれます。

アクティビティ1:スーパーアクティビティ

public abstract class SuperActivity extends Activity

アクティビティ2:MainActivity

public class MainActivity extends SuperActivity {

  private MyObject myMemberVariable;    

  @Override
  public void onCreate(Bundle savedInstanceState) {

    //Get the intent that started this activity. I am always providing Extras, so this is never null.
    Bundle bundle = getIntent().getExtras();

    //Set stuff in myMemberVariable from these extras. This never fails either.
    myMemberVariable = BundleLoader.loadFromBundle(bundle);

  }


  @Override
  public void onListDialogClick(int requestCode, String[] options, int position, String extra) {
    //THIS is the place where, according to my stacktrace from the DeveloperConsole, the null pointer arises.
    myMemberVariable.setXY(position);
  }

アクティビティ3:ListDialogActivity

public class ListDialogActivity extends SuperActivity

ここで行っているのは、MainActivityからListDialogActivityを開始して、ユーザーにいくつかの選択肢を提示することです。彼が選択を行うと、ListDialogActivityは結果を設定して終了します。SuperActivityで私は持っています:

onActivityResult(int requestCode, int resultCode, Intent data) {
  //if activityRequestCode was ListDialogRequestCode and the Result was RESULT_OK, then call onListDialogClick(..) with the appropriate values.
}

これが私のMainActivityのonListDialogClick()が呼び出される方法です(つまり、通常のonActivityResult()と考えることができます)。そこでは、myMemberVariableがnullであるため、一部のユーザーでnullポインター例外が発生します。

ここで何が起こっているのか理解できません。また、電話の回転を処理するためにインスタンスの状態を保存していますが、保存しなかった場合でも、onCreateが呼び出されるため、nullにはならず、状態が失われ、最初のインテントから再作成されるだけです。

誰かがこれがどのように可能であり、ここで何が起こっているのかを私に説明できますか?Androidの何かを誤解しましたか?なぜそれは少数の人々にしか起こらないのですか?これの理由は何でしょうか?どんなに小さな提案でも本当に感謝しています。

本当にありがとう!

4

1 に答える 1

17

zapl は、値を onSaveInstanceState に保存する必要があるという点で正しいです。私の場合、onActivityResult の前に実行される onCreate() で復元しているので、NullPointerExceptions はもうありません!

あなたはおそらく今までにこれを分類したでしょうが、私は同じ問題でたくさんの問題を抱えていました. 私のアプリはカメラを起動して写真を撮り、キャプチャしたファイルをアプリの currentDirectory にコピーします。写真を撮ったときに、onActivityResult で NullPointerExceptions が発生することがありました。

アクティビティが Android のメモリ管理によって強制終了され、再作成され、すべてのメンバー変数が失われたに違いないことに気付くまでにしばらく時間がかかりました。これは明らかではありませんでした (このようなシームレスなキル / 復元は Android に脱帽です!)。これは HTC Desire HD で発生していたもので、非常にランダムで追跡が非常に困難でした。

于 2012-10-12T15:34:49.037 に答える