美文网首页
android 模拟内存不足 应用释放framgnet错乱并解决

android 模拟内存不足 应用释放framgnet错乱并解决

作者: 代瑶 | 来源:发表于2018-04-27 12:27 被阅读0次

    序言

    现在手机内存都还挺大的,我们用魅族Mx4pro 3G内存做实验可以申请到的最大内存空间为221M 如果设定属性android:largeheap = "true"时, 可以申请的最大内存空间为478M,是原来的两倍多一些。
    假如现在应用退到后台了,执行了某个清理软件可能app会收到内存紧张的通知再进入app可能我们activity就重启了,里面如果有fragemnt那可能就出现了错乱问题 !开始我们的表演

    Fragment错乱展示图.png

    进入主题

    Anroid基于进程中运行的组件及其状态规定了默认的五个回收优先级:

    • Empty process(空进程)
    • Background process(后台进程)
    • Service process(服务进程)
    • Visible process(可见进程)
    • Foreground process(前台进程)

    我们使用模拟器来模拟 , 新建模拟器配置参数


    image.png

    运行起来我们app -> 随便点击让fragment进行替换 -> Home键盘回到后台 -> 打开系统浏览器或者其他
    -> studio执行命令 am kill 包名 通知内存紧张 -> ok 再到我们主界面看看fragment是不是乱了

    解决办法

    在activity中

    if (savedInstanceState != null && !savedInstanceState.isEmpty()) {
                try {
                    List<Fragment> fragments = getSupportFragmentManager().getFragments();
                    for (int i = 0; i < fragments.size(); i++) {
                        getSupportFragmentManager()
                                .beginTransaction()
                                .remove(fragments.get(i))
                                .commitAllowingStateLoss();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
    
                EventBus.getDefault().unregister(this);
                ActivityManager.getInstance().finishAllActivity();
                this.finish();
    
                Intent intent = new Intent(this, MainActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                startActivity(intent);
                return;
            }
    

    最简单暴力的方法,让Activity重置!如果需要保存Fragment状态可以使用
    onSaveInstanceState // 内存吃紧保存状态
    onRestoreInstanceState // 例如切换横竖屏时Activity销毁后 回复状态方法 参数一定有数据

    相关文章

      网友评论

          本文标题:android 模拟内存不足 应用释放framgnet错乱并解决

          本文链接:https://www.haomeiwen.com/subject/lkeblftx.html