Android: Activity在Restore时的数据缓存问题
来源:互联网 发布:宏观经济数据网站 编辑:程序博客网 时间:2024/06/17 03:44
一、红米Note上频繁NullPointException
继解决了Fragment中使用getActivity()返回null的问题后,在测试中又发现,在红米Note上离开程序后从后台返回时经常Crash,错误仍然是NullPointException。。。
项目需求是要求先登录,在LoginActivity登录完毕获取到Token后,我直接用Intent传给了主界面MainActivity再进行后续操作。但是当程序后台被杀掉后再恢复时,虽然会重新执行MainActivity的onCreate()
,但是Intent内的数据却不会再有,我取出Token后没有做判断就使用,于是就抛出了NullPointException。
红米系列内存比较小,App切换到后台以后极易被干掉,所以这个问题在红米Note上比较容易重现。
二、保存
错误的原因在于没有缓存Intent传入的数据,那我们就缓存一下好了。
最简单的办法莫过于写入SharedPreference了,存入取出都很方便:
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);// 存入数据sp.edit().putString("token", token).apply();// 取出数据String token = sp.getString("token", null);
但是sp只适合存放少量的数据,若需要缓存的数据稍复杂一点用sp就会很麻烦,另一种办法是用数据库缓存,但数据库缓存代码量比较大,改动也不是很方便。
其实,Android已经考虑到了这种问题,提供了一种系统级的界面缓存数据的方法,即InstanceState机制。
三、利用Android的InstanceState机制
我们可以看到,在Activity的onCreate()
方法是带参数的:
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}
同时,Activity还带有两个方法:onSaveInstanceState()
和onRestoreInstanceState()
:
Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法。
它们不同于 onCreate()、onPause()等生命周期方法,它们并不一定会被触发。当应用遇到意外情况(如:内存不足、用户直接按Home键)由系统销毁一个Activity时,onSaveInstanceState()会被调用。
但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用。因为在这种情况下,用户的行为决定了不需要保存Activity的状态。
通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。
因此,在InstanceState内保存数据的方法类似SP,非常简单:
@Overridepublic void onSaveInstanceState(Bundle savedInstanceState){ super.onSaveInstanceState(savedInstanceState); savedInstanceState.putString("token", token);}@Overridepublic void onRestoreInstanceState(Bundle savedInstanceState){ super.onRestoreInstanceState(savedInstanceState); token = savedInstanceState.getString("token");}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 你也可以在onCreate()里恢复数据// 但这样做需要判断恢复的数据出来是否为nulltoken = savedInstanceState.getString("token");}
这样,在后台内存不足程序被回收时,会自动缓存数据,下次进入时自动恢复就不会抛出异常了。
参考
[1] Android开发之InstanceState详解
本文首发http://www.dss886.com,转载请注明
- Android: Activity在Restore时的数据缓存问题
- Activity数据的缓存
- Android--Activity在跳转时携带数据
- hibernate刷新数据时的缓存问题
- hibernate刷新数据时的缓存问题
- hibernate刷新数据时的缓存问题
- 缓存过期时的数据压力问题
- 【Android】Popup Window 在 Android Activity无法弹出的问题
- Android之在不同的Activity之间传递数据
- Android 实例:在Activity 之间传递数据的intent
- 不要在Android的Application对象中缓存数据!
- 不要在Android的Application对象中缓存数据!
- 不要在Android的Application对象中缓存数据!
- 不要在Android的Application对象中缓存数据!
- 不要在Android的Application对象中缓存数据
- 不要在Android的Application对象中缓存数据!
- 不要在Android的Application对象中缓存数据!
- 不要在Android的Application对象中缓存数据!
- CentOS6.5 添加用户到 sudoers
- Oracle pl/sql编程 6---plsql中的%rowtype
- Python中::(双冒号)的用法
- 程序员法则
- Linux系统CentOS7中,fstab出错,系统重启进入emergency mode的解决办法
- Android: Activity在Restore时的数据缓存问题
- 妆渍啄最座紫昨总
- 进程控制
- Hadoop 安装
- Hibernate 缓存机制
- 仿QQUI实现(1)
- Android技术简答题
- Android 属性动画
- 有参函数