美文网首页
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