Android应用共享数据被回收解决办法

有时候我们会发现从最近打开应用列表中再次打开应用的时候,可能会出现应用崩溃的情况.原因:大多数情况就是系统内存吃紧的时候给回收了,如果有日志报告的手机,则可以清楚的看到这是一个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();
	}
}

如果有什么不对的地方,还请指出来!谢谢。

Demo下载!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值