Android onActivityResult。成员变量有时为空

Android onActivityResult。成员变量有时为空,android,exception,pointers,null,Android,Exception,Pointers,Null,我已经编写了一个应用程序,现在发布后,我的一些用户似乎遇到了一个严重的bug。一个我根本无法复制的东西 这涉及三项活动 活动1:超活性 public abstract class SuperActivity extends Activity 活动2:主要活动 public class MainActivity extends SuperActivity { private MyObject myMemberVariable; @Override public void

我已经编写了一个应用程序,现在发布后,我的一些用户似乎遇到了一个严重的bug。一个我根本无法复制的东西

这涉及三项活动

活动1:超活性

public abstract class SuperActivity extends Activity
活动2:主要活动

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.
}
这就是调用my MainActivity中onListDialogClick()的方式(因此您可以将其视为正常的onActivityResult()。在这里,一些用户会遇到null指针异常,因为myMemberVariable为null

我不知道这里发生了什么。此外,我正在保存我的实例状态以处理电话轮换,但即使我没有这样做,因为onCreate将被调用,它仍然不会为null,它只会丢失其状态并根据最初的意图重新创建

谁能给我解释一下这是怎么可能的,这里发生了什么?我是不是误解了安卓的一些东西?为什么它只发生在少数人身上?这可能是什么原因?即使是最微小的建议,我也会非常感激


非常感谢

zapl是正确的,因为您必须将值保存在onSaveInstanceState中,在我的例子中,我正在onCreate()中恢复,它在onActivityResult之前运行,因此没有更多的NullPointerException

你现在可能已经解决了这个问题,但我在同一个问题上遇到了很多麻烦。我的应用程序启动相机拍照,然后将捕获的文件复制到应用程序中的currentDirectory中。偶尔在拍摄照片时,我会在onActivityResult中看到NullPointerException


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

发生这种情况的设备有什么共同因素吗?我还没有找到一个共同因素(我确定发生在有CM9的Galaxy S2和有HTC one x的人身上。)但除此之外,我不知道,因为开发人员控制台没有向我显示bug来自哪些设备?在代码中,我可以看到它总是
null
,因为它等于
private MyObject myMemberVariable=null它在onCreate中初始化。看来我在简化代码方面做得太过分了。实际上,它是通过一个静态类从Bundle加载的。如果该类因为包中没有合适的数据而返回null,它将在那里抛出异常。但这种情况从未发生过。(我现在将在我的评论中反映出来。谢谢)原因是:非常感谢你的回答!我也有同样的问题,但我无法解决。干得好;)哇,5年后,仍然相关,救了我的命;谢谢你。真是一只难以捉摸的虫子!