有时候我们会发现从最近打开应用列表中再次打开应用的时候,可能会出现应用崩溃的情况.原因:大多数情况就是系统内存吃紧的时候给回收了,如果有日志报告的手机,则可以清楚的看到这是一个NullpointException。当然出现这种情况一般是在Activity的onResume或onRestart中的数据已经是null;可能是整个Application的共享数据已被回收.至于怎么解决呢,请往下看。
要点:
当应用被回收了的时候,我们从最近列表中再次打开app时,会重新创建新的Application实例,所有的activity将会重新执行onCreate(),所以之前整个应用的数据都被清空了。因此当前Activity在此引用共享的数据就回报NullpointException。如果需要模拟回收的情况,使用DDMS的stop process是个不错的选择。
其实我们只需要抓住如何不崩溃,这就需要共享数据 存在。所以我们要保存共享数据到每一个activity,因为每一个activity都可能会面临回收,但是被回收后,再次打开onRestoreInstanceState(Bundle bundle)这个方法是会执行,或者也可以直接在onCreate(Bundle bundle)中拿出我们保存的数据,因为onCreat()先于它执行,可以避免空指针错误。
另外:google官方建议的保持共享数据和Application的生命周期一致,所以共享数据最好存在Application当中。
下面我们用实例来模拟下以上出现的场景:
用户登录后,会在之后的每一个activity中使用到他的个人信息。
public class BaseActivity extends Activity
{
protected Context context;
protected MyApplication application;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
application=(MyApplication) getApplication();
if(savedInstanceState!=null)
{
User user=(User) savedInstanceState.getSerializable("user");
application.setUser(user);
}
context=this;
}
@Override
protected void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
outState.putSerializable("user", application.getUser());
}
}
然后在Application中
public class MyApplication extends Application
{
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public void onCreate()
{
super.onCreate();
}
}
如果有什么不对的地方,还请指出来!谢谢。