NullPointerException从后台返回时

时间:2013-09-06 04:48:16

标签: android garbage-collection nullpointerexception android-activity

我的应用程序有大约3个深度的活动层次。

许多活动或片段在MainApplication中使用UserVo。

所以我将UserVo置于活动或片段中。

UserVo user;

onCreate() {
    user = MainApplicatoin.getSingleton().getUser();
    // ...
}
// ...
onClick(View v) {
    textView.setText(user.getData().name);
}

但有时从背景回到我的应用程序时会出现NullPointerException。

我认为它是由GC发生的。

如何防止用户== null,或者在用户== null时重启我的应用程序?

==

MainApplication.java(我将它设置为清单中的应用程序)

private static MainApplication sigleton;
@Override
public void onCreate() {
    super.onCreate();

    singleton = this;
    }

MainApplication getSington() {
    return singelton;}

2 个答案:

答案 0 :(得分:0)

我猜这条线在按下后退按钮时会出现问题:

user = MainApplicatoin.getSingleton().getUser();
当你移动到下一个活动时,

用户在当前活动中变为空(让我们说活动A)(让我们说活动B)。所以当你按回来时你会得到零点异常。

可能的解决方案是:

当您尝试从A移动到活动B时(可能按下按钮),将'user'的值传递给下一个活动B,然后将其捕获。

覆盖活动B中的backPress:

@Override
    public void onBackPressed() {
        super.onBackPressed();
            //here pass the captured user value back to Activity A.....
    }

答案 1 :(得分:0)

我认为这是关于你的应用程序何时进入后台,系统可能会在低成本时回收它。

因此,您可以将UserVo变为Parcelable类,将其保存在activity的onSaveInstanceState函数中,并在onRestoreInstanceState函数中读取它,代码如下。

void onSaveInstanceState(Bundle outState) {
   ...
   outState.putParcelable("user", user);
   ...
}

void onRestoreInstanceState(Bundle savedInstanceState) {
   ...
   user = savedInstanceState.getParcelable("user");
   ...
}