11

我已经编写了一个应用程序,现在,发布后,我的一些用户似乎遇到了一个讨厌的错误。我根本无法复制的一个。

涉及这三个活动。

活动一:超级活动

public abstract class SuperActivity extends Activity

活动二: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);
  }

活动三: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 为空。

我无法弄清楚这里发生了什么。此外,我正在保存我的实例状态来处理手机旋转,但即使我没有,因为 onCreate 会被调用,它仍然不会为空,它只会丢失它的状态并从初始 Intent 重新创建。

谁能向我解释这是怎么可能的以及这里发生了什么?我是否误解了Android的某些内容?为什么只发生在少数人身上?这可能是什么原因?即使是最微小的建议,我也会非常感激。

非常感谢!

4

1 回答 1

17

zapl 是正确的,因为您必须将值保存在 onSaveInstanceState 中,在我的情况下,我正在恢复 onCreate(),它在 onActivityResult 之前运行,因此不再有 NullPointerExceptions!

您现在可能已经对此进行了排序,但是我在同一个问题上遇到了很多麻烦。我的应用程序启动相机拍照,然后将捕获的文件复制到应用程序中的 currentDirectory 中。有时,在拍摄照片时,我会在 onActivityResult 中收到 NullPointerExceptions。

我花了一段时间才意识到这个活动一定是被安卓的内存管理杀死了,然后重新创建了,从而丢失了我所有的成员变量。这并不明显(向 Android 致敬,以实现如此无缝的杀戮/恢复!)。这发生在 HTC Desire HD 上,而且非常随机,很难追踪。

于 2012-10-12T15:34:49.037 回答