Android onActivityResult。成员变量有时为null

时间:2012-04-29 15:35:35

标签: android exception pointers null

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

参与其中的是三项活动。

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

我无法弄清楚这里发生了什么。另外,我正在保存我的实例状态以处理电话轮换,但即使我没有,因为onCreate将被调用,它仍然不会为null,它只会丢失它的状态并从初始Intent重新创建。 / p>

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

非常感谢!

1 个答案:

答案 0 :(得分:12)

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

你可能已经对此进行了排序,但我遇到了同样问题的麻烦。我的应用程序启动相机拍照,然后将捕获的文件复制到应用程序中的currentDirectory。偶尔拍摄照片时,我在onActivityResult中获得了NullPointerExceptions。

我花了一段时间才意识到活动一定是被Androids内存管理所杀死,并重新创建,从而失去了我所有的成员变量。这并不明显(对Android进行这种无缝杀死/恢复的帽子!)。这是在HTC Desire HD上发生的,并且非常随机,很难追踪。