Android onActivityResult.成员变量有时为null

met*_*ter 9 null android pointers exception

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

参与其中的是三项活动.

活动1:SuperActivity

public abstract class SuperActivity extends Activity
Run Code Online (Sandbox Code Playgroud)

活动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);
  }
Run Code Online (Sandbox Code Playgroud)

活动3:ListDialogActivity

public class ListDialogActivity extends SuperActivity
Run Code Online (Sandbox Code Playgroud)

我在这里做的是从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.
}
Run Code Online (Sandbox Code Playgroud)

所以这就是我的MainActivity中的onListDialogClick()被调用的方式(所以你可以把它想象成普通的onActivityResult()).在那里,一些用户遇到空指针异常,因为myMemberVariable为null.

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

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

非常感谢!

Wal*_*ale 12

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

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

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

  • 哇,5年后,仍然相关,并救了我的屁股; 谢谢你.这样一个难以捉摸的虫子! (2认同)