<Android>在Activity被非正常杀死并重建时,使用savedInstanceState进行数据恢复的简单实例

在Android开发中,当Activity由于内存不足被系统杀死后,可以通过onSaveInstanceState来保存关键数据。当Activity重建时,利用onCreate中接收到的savedInstanceState恢复数据。本文以图片浏览为例,说明如何在内存溢出崩溃后,恢复图片路径列表,防止界面数据丢失。
摘要由CSDN通过智能技术生成

转载请标明出处:http://blog.csdn.net/u013015161/article/details/46540135


需求:

最近在折腾一个需求,功能可以理解为类似微信朋友圈的编辑界面:用户可以在编辑的时候插入图片,图片数量暂时未定上限。用户可以点击任意一张图片,跳转进入图片浏览界面(另一个Activity)查看大图,左右滑动切换图片。


问题:

当插入的图片数量过多时, 打开图片浏览时, 不断循环滑动切换图片,有概率出现程序内存溢出崩溃(OOM)。这个时候点击确定dismiss掉崩溃对话框时,可以看到从浏览图片界面回到了编辑界面,刚刚还有的图片列表,现在一片空白。


分析:

通过 打印日志,看到在程序崩溃之后, 编辑界面的Activity又执行了一边onCreate。看来是因为内存不足, 编辑界面被系统杀掉,然后又重建了。


解决:

面对类似这种因为内存不足而被系统杀死的非正常“死亡”方式, Activity会调用回调函数onSaveInstanceState(Bundle outState)。在这里可以将数据存入outState。之后Activity重建, 调用onCreate时,该Bundle 对象会被作为参数传入,这时可以将保存的值取出。本例中,丢失的数据是图片本地路径列表,导致重建之后展示小图图片的GridView没有数据,所以对该数据进行保存与恢复即可。


代码:

1、在onSaveInstanceState中保存数据:

@Override
    protected void onSaveInstanceState(Bundle outState) {
        // TODO Auto-generated method stub
        super.onSaveInstanceState(outState);
        outState.putStringArrayList("photos", (ArrayList<String>) photos);
    }

2、在onCreate中恢复:

if(null != savedInstanceState)
        {
            photos = savedInstanceState.getStringArrayList("photos");
        }
        else
        {
            photos = new ArrayList<String>();
        }

结果:

当浏览图片大图崩溃后,重新回到编辑界面, 可以看到小图列表存在,较之前没有变化, 再次点击小图,可以重新进行图片浏览。问题解决。


Activity被销毁,其中的数据将会丢失。为了避免这种情况,可以将数据保存Activity的生命周期方法中,例如onSaveInstanceState()。在这个方法中,可以保存Activity的状态信息,例如EditText中的文本,CheckBox的选中状态等等。系统将会在Activity被销毁前调用这个方法,让你有机会保存数据。 具体的步骤如下: 1. 在Activity中重写onSaveInstanceState()方法。 2. 在onSaveInstanceState()方法中,使用Bundle对象保存需要保存数据。 3. 在Activity的onCreate()方法中,判断savedInstanceState是否为null。如果savedInstanceState不为null,说明Activity是被销毁后重新创建的,可以从savedInstanceState中获取保存数据。 以下是一个示例代码: ``` public class MainActivity extends Activity { private EditText mEditText; private CheckBox mCheckBox; private boolean mIsChecked; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mEditText = (EditText) findViewById(R.id.editText); mCheckBox = (CheckBox) findViewById(R.id.checkBox); if (savedInstanceState != null) { mEditText.setText(savedInstanceState.getString("text")); mIsChecked = savedInstanceState.getBoolean("isChecked"); mCheckBox.setChecked(mIsChecked); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString("text", mEditText.getText().toString()); outState.putBoolean("isChecked", mCheckBox.isChecked()); } } ``` 在这个示例中,我们保存了EditText中的文本和CheckBox的选中状态,并在Activity重新创建恢复了它们的状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值