我已经编写了一个应用程序,现在,在发布后,我的一些用户似乎遇到了一个令人讨厌的错误。一个我根本无法再现的。
参与其中的是三项活动。
活动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中的某些内容?为什么只发生在少数人身上?这可能是什么原因?即使是最微小的建议,我也会非常感激。
非常感谢!
答案 0 :(得分:12)
zapl是正确的,因为你必须将值保存在onSaveInstanceState中,在我的情况下,我将恢复onCreate(),它运行在onActivityResult之前,所以不再有NullPointerExceptions!
你可能已经对此进行了排序,但我遇到了同样问题的麻烦。我的应用程序启动相机拍照,然后将捕获的文件复制到应用程序中的currentDirectory。偶尔拍摄照片时,我在onActivityResult中获得了NullPointerExceptions。
我花了一段时间才意识到活动一定是被Androids内存管理所杀死,并重新创建,从而失去了我所有的成员变量。这并不明显(对Android进行这种无缝杀死/恢复的帽子!)。这是在HTC Desire HD上发生的,并且非常随机,很难追踪。