android 内存溢出前退出界面,Android 导航(介绍)页面ViewPager内存溢出解决方法...

2023-10-29

现在基本每个Android App都会标配一个启动介绍的页面,或做产品介绍,或做app功能展示,既然起导航界面,基本思路就是用ViewPager实现。(图片引自UI中国一设计师的设计图片)

bVpE81

正好这几天在做这个导航界面,我的测试手机是魅族MX3,做完之后测试还行,没有明显卡顿的现象,但是当我把debug的apk装到米3和魅蓝上时,程序运行到这个导航界面会马上crash掉,偶尔没有crash也会出现明显的卡顿现象,体验效果非常差。

打开Android Studio的内存管理器查看运行时分配内存,当时我就蒙逼了,180+M左右,就这个导航界面用了180M,还做什么安卓。。。

改了很多地方,效果依旧不明显,查阅资料有说另外写一个Adapter继承自PagerAdapter,方法如下:

class GuideAdapter extends PagerAdapter{

private List views;

private final LinkedList recyleBin=new LinkedList<>();

public GuideAdapter(Listviews){

this.views=views;

}

@Override

public int getCount() {

return views.size();

}

@Override

public boolean isViewFromObject(View view, Object object) {

return view==object;

}

@Override

public void destroyItem(ViewGroup container, int position, Object object) {

container.removeView(views.get(position));

}

@Override

public int getItemPosition(Object object) {

return super.getItemPosition(object);

}

@Override

public Object instantiateItem(ViewGroup container, int position) {

//在此设置背景图片,提高加载速度,解决OOM问题

View view;

int count=getCount();

if(!recyleBin.isEmpty()) {

view=recyleBin.pop();

}else {

view=views.get(position);

ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(

ViewGroup.LayoutParams.MATCH_PARENT,

ViewGroup.LayoutParams.MATCH_PARENT);

view.setBackgroundResource(images[position % count]);

view.setLayoutParams(params);

}

container.addView(view,0);

return views.get(position);

}

}

初始化的时候让viewpager的adapter为上面的自定义的adapter即可,基本代码如下:

private ViewPager mViewPager;

private GuideAdapter mGuideAdapter;

private int[] images;//显示介绍的图片的id值

private ArrayListviews;

private ImageView[] indicator=null;//下面的导航指示器,此处不做过多介绍,可忽略

...

...

//控件初始化业务

mViewPager=(ViewPager)findViewById(R.id.viewpager);

views=new ArrayList<>();

//此处放入五张介绍的图片的id值

images=new int[]{R.drawable.bg_1,R.drawable.bg_2,R.drawable.bg_3,R.drawable.bg_4,R.drawable.bg_5}

//adapter实例化

mGuideAdapter=new GuideAdapter(views);

//循环加入图片的业务

for(int i=0;i

ImageView mImageView=new ImageView(this);

//下面这一步会导致OOM,所以添加backgroundResource的步骤在自定义的adapter的

//instantiateItem方法里面实现,此处已注释

//mImageView.setBackgroundResource(images[i]);

views.add(mImageView);//添加入动态数组里面,此处的ImageView里面均为没有背景的imageview

//for循环内还有指示器的添加,因不在讨论问题的重点内,忽略业务代码

}

//为mViewPager绑定适配器

mViewPager.setAdapter(mGuideAdapter);

mViewPager.setCurrentItem(0);

mViewPager.setOffscreenPageLimit(1);

mViewPager.setOnPageChangeListener(this);

...

...

基本的思路就是让加载viewpager过多的没有显示的图片在自定义的Adapter的destroyItem里面销毁释放内存,防止造成OOM或者内存溢出crash的问题,这种方法每次加载viewpager的时候只会加载当前一页和前后两页共三页,所以内存占用不会很高。

但是,但是,问题来了。。。重新编写之后测试发现:te me还是占用160M+内存,当时我就傻了。。。怎么不见效果呢。。。于是好长时间都在查资料,找问题,debug。。。

然而,半天过去了。。。

我还是没找到问题到底出在哪里。。。

后来,导师和我说看一下你的图片多少大,我说100k的样子,然后他看了一下,说让我把所有图片拖到PS里面转成PNG再导出来(之前一直都是JPG)。于是照做了,顺便看了一眼新导出的图片大小,看了一下都比JPG的要大,于是半信半疑的替换资源,重新编译运行后。终于惊喜的发现内存占用降到40-60M之间了。。。原来是图片格式的问题,欸,搞了半天头都大了,原来是这么简单的问题。。。

这也横向提示我们以后Android编程里面的资源最好不要用JPG格式的,下载类的图片资源也是,因为32位的PNG颜色过渡平滑且支持透明,JPG是像素化压缩过的图片,质量已经下降了,PNG的压缩算法解压快很多,JPG的话可以有很高的压缩比(当然会有损失),所以综合考虑还是用PNG比较好(特殊需求除外)。

在此也感谢我的导师,在我开发当中教我好多,第一次写博客,即当作自己的记事本,日后还能看看,也希望能解决大家相似的问题,第一次写,一定会有表达不到位,表述不清楚的地方,希望留下你的评论和建议,我也可以改正,提高自己。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android 内存溢出前退出界面,Android 导航(介绍)页面ViewPager内存溢出解决方法... 的相关文章

  • MySql基础--灵活运用sql语句

    数据库脚本 请勿随意修改本人数据 内藏玄机 可随意增加数据 补充 DISTINCT 去重 1 创建学生表 CREATE TABLE t student sid INT NOT NULL AUTO INCREMENT COMMENT 学号 s
  • HTML5中div section article的区别

    刚刚开始接触 HTML5 时 对它的标签很不适应 甚至一度有点反感 尤其是对 div section article 这几个标签 实在弄不清楚应该使用在什么场合下 div 这个标签是我们见得最多 用得最多的一个标签 本身没有任何语义 用作布
  • Google App Engine 的简易教程(转载)

    源地址 http peopleyun com p 868 本文将通过一个简单的例子 来介绍大家如何创建一个简单App Engine程序 首先 给大家介绍一下Google App Engine Google App Engine的介绍 Goo
  • 骰子布局

    一 骰子的布局 骰子的一面 最多可以放置9个点 下面 就来看看Flex如何实现 从1个点到9个点的布局 你可以到codepen查看Demo 如果不加说明 本节的HTML模板一律如下 div class box span class item
  • redis(9)、redis集群之redis Cluster使用

    redis技术目录 前提 redis集群分片 目前redis有两类方案 哈希槽 hash slot 代表方案 redis cluster 一致性哈希 代表方案 twemproxy codis 本篇是针对redis cluster配置实现 原
  • UE4_VR传送

    传送抛物线的计算 制作步骤 在BPC TraceInterfaction新建一个函数 ParabolicTrace 新建一个材质 M Teleport 把BlendMode 设置为透明的 Translucent TexCoord 相当于UV
  • 【论文阅读】Learning Convolutional Neural Networks for Graphs

    出版 ICML 2016 原文 http 211 81 63 130 cache 2 03 proceedings mlr press cb5795e96aa42362f86e2ba3a13c32af niepert16 pdf 卷积神经网
  • 卷积过程的一个动态图很形象

    卷积神经网络的卷积过程
  • Mysql中的读写锁,表锁和行锁,间隙锁

    Mysql数据库锁 锁是计算机协调多个进程或线程并发访问某一资源的机制 在数据库中 除传统的计算资源 如CPU RAM I O等 的争用以外 数据也是一种供许多用户共享的资源 如何保证数据并发访问的一致性 有效性是所有数据库必须解决的一个问
  • 数据库drop、delete、truncate的区别是什么?

    在Java中 数据库操作中的DROP DELETE和TRUNCATE是三种不同的操作 用于对数据库中的表或数据进行删除 它们的区别如下 1 DROP DROP用于完全删除数据库中的表 包括表的结构和数据 执行DROP操作后 表将不再存在于数
  • Eclipse的switch workspace 选项中删除多余的workspace

    打开Eclipse后 选择功能菜单里的Windows gt Preferences gt 弹出对话框后 选择General gt Startup and Shutdown gt workspace gt 右视图可以看见workspace中出
  • 算法-经典趣题-马踏棋盘(又称骑士周游)

    本文为joshua317原创文章 转载请注明 转载自joshua317博客 算法 经典趣题 马踏棋盘 又称骑士周游 joshua317的博客 一 问题 马踏棋盘问题 又称骑士漫步 它是一个非常有趣的智力问题 马踏棋盘问题的大意如下 国际象棋
  • x5650服务器装系统,笔记本处理器天梯图,小猪教您最新笔记本显卡天梯图

    我们都晓得CPU的功能主要是解释计算机指令以及处理计算机软件中的数据 在我们选购电脑时 CPU是我们首要考虑的电脑部件 而笔记本CPU天梯图也就是移动处理器天梯图 是用户鉴定笔记本电脑CPU性能高低的一种方式 下面 小编就给大伙分享最新笔记
  • 魔兽世界怀旧服务器无限刷怪点,魔兽世界怀旧服50级刷怪地点汇总

    魔兽世界怀旧服50级刷怪在哪刷 55级可以去东部大陆的东瘟疫之地 除去一些必做的银色黎明和佛丁任务 盗贼等职业完全可以钻进考林路口 那么小编就为大家带来魔兽世界怀旧服50级刷怪地点汇总 快来看看吧 魔兽世界怀旧服50级刷怪在哪刷 卡利姆多和
  • 往GitHub上传大文件

    1 下载Git Git Downloads 2 下载GitLFS https git lfs github com 3 复制URL 4 在本地创建文件夹 右键Git Bash Here 5 粘贴URL进行下载 下载到本地 git clone
  • CDH6.3.2实战1:安装与配置

    问题导读1 CDH6 3 2需要什么安装环境 2 怎样安装CDH6 3 2 3 怎样部署CDH6 3 2 PART 01 CM简介Cloudera Manager是一个拥有集群自动化安装 中心化管理 集群监控 报警功能的一个工具 使得安装集
  • VS2022+CMAKE+OPENCV+QT+PCL安装及环境搭建

    VS2022安装 Visual Studio 2022安装教程 千字图文详解 手把手带你安装运行VS2022以及背景图设置 vs安装教程 我不是大叔丶的博客 CSDN博客 CMAKE配置 win11下配置vscode cmake 心儿痒痒的
  • .Net与J2EE的快餐型比较,纯属个人之见

    经常有客户问我 到底用微软平台还是Java平台的问题 其实这是一个永远没有结果的悖论 只能陷入空对空的空谈 不过如果抛弃个人喜好与特定客户的历史原因来客观地考虑 二者之间的确是微软平台的优势更加明显一些 Net J2EE 描述 技术架构 技
  • MySQL基础架构

    一 背景 为什么我先学习MySQL的基础架构呢 原因很简单 当我们需要了解一项新事物的时候 我们只有站在宏观的层面 才能层层的去理解问题 举个例子 我们要看一个框架的源码 一开始钻研进去研究 发现就有点 丈二的和尚摸不着头脑 因为我们没有自

随机推荐

  • 初识C语言(一)

    目录 一 什么是C语言 二 第一个C语言程序 2 1创建项目 2 2新建 c文件 2 3写代码 三 数据类型和计算机中常见的计量单位 3 1基本数据类型 3 2修饰符 3 3自定义数据类型 3 4类型转换 3 4计算机中常见的计量单位 四
  • termux安装vscode(code-server)遇到的一些坑

    termux安装vscode即安装code server遇到很多坑 安装code server有四种方式 其他的不清楚 方式一 termux安装Linux 方式二 termux安装 wget code server压缩包解压执行 方式三 t
  • 用K近邻(KNN)机器学习算法进行股票走势预测-Python

    什么是K近邻 KNN K近邻 KNN K Nearest Neighbors 是最简单的机器学习算法之一 可用于回归和分类 KNN是一种 惰性 学习算法 从技术上讲 它不训练模型来进行预测 K近邻的逻辑是 假设有一个观测值 这个观测值被预测
  • 《架构300讲》学习笔记(101-150)

    前言 内容来自B站IT老齐架构300讲内容 101结合操作系统如何理解java代码怎么运行 102 某读书会Redis 大Key引发的线上事故分析总结 分类 Redis 定义 大key是 超过百kb的键值对 产生问题 单线程指令队列积压严重
  • 服务器网站属性在哪里设置的,服务器网站属性在哪里

    服务器网站属性在哪里 内容精选 换一换 本文档指导用户使用华为云市场镜像 Moodle LMS在线学习系统 LAMP 部署Moodle课程管理系统 Moodle是一个开源的课程管理系统 采用PHP MySQL开发 可以帮助教育者建立有效的在
  • Redis 安装报错 error: jemalloc/jemalloc.h: No such file or directory解决方法

    错误描述 安装Redis 2 8 18时报错 zmalloc h 50 31 error jemalloc jemalloc h No such file or directory zmalloc h 55 2 error error Ne
  • Redis数据结构——动态字符串、Dict、ZipList

    一 Redis数据结构 动态字符串 我们都知道Redis中保存的Key是字符串 value往往是字符串或者字符串的集合 可见字符串是Redis中最常用的一种数据结构 不过Redis没有直接使用C语言中的字符串 因为C语言字符串存在很多问题
  • 自动控制原理:反馈控制系统的复域分析

    参考文献 1 胡寿松 自动控制原理 M 第六版 北京 科学出版社 2015 2 姜增如 自动控制理论虚拟仿真与实验设计 M 第一版 北京 北京理工大学出版社 2020 文中出现的代码均为Matlab代码 1传递函数 传递函数 transfe
  • 【面试题】:说一下登录模块的思路以及登录的优化

    1 静态 首先我们要做静态和表单验证 2 密码加密 在输入完手机号和密码后 我们要对密码进行加密 加密的话使用插件md5对密码加密 之后将请求发送到后台 3 封装登录 因为我们在项目里的请求是按模块来进行划分的 所以我们会通过axios方法
  • java数组显示_java数组

    1 package com oracle demo01 2 3 public class MyArray 4 定义一个数组 5 private int intArray 6 定义数组的实际有效长度 7 private int elems 8
  • 多线程事务

    背景介绍 1 最近有一个大数据量插入的操作入库的业务场景 需要先做一些其他修改操作 然后在执行插入操作 由于插入数据可能会很多 用到多线程去拆分数据并行处理来提高响应时间 如果有一个线程执行失败 则全部回滚 2 在spring中可以使用 T
  • html转turndown 踩雷 以及成功方案 (vue2 + tinymce富文本框)

    showdown 这里使用showdown转换 富文本框内所有格式够可以 但是表格不行 表格转换为竖线 内容丢失 如果没有表格需求 可参 注意 这里的this markdown 是在data中声明的 this value为你要转换的html
  • jdbc连接oracle连接重置问题

    error ConnectionProviderFactory initializeConnectionProviderFromConfig 173 Initializing connection provider org springfr
  • 服务器系统的安装方法,服务器的操作系统安装方法

    服务器的操作系统安装方法 内容精选 换一换 如果Windows操作系统云服务器未安装密码重置插件 可以参见本节内容重新设置密码 本节操作介绍的方法仅适用于修改Windows本地账户密码 不能修改域账户密码 Linux操作系统请参见重置Lin
  • K-小千很好奇-(素数)2023河南萌新联赛第(八)场:南阳理工学院

    include
  • MYSQL-ORCALE decode函数在MYSQL中的实现

    一 select ifnull etl filed col mysql中实现oracle的decode函数需要用到三个函数 1 ELT N str1 str2 str3 若N 1 则返回值为 str1 若N 2 则返回值为 str2 以此类
  • 蓝桥杯java基础练习学习。

    一 基础练习 大部分程序来自查阅网络资源总结 1 A B的问题 package Chapter01 import java util Scanner A B的问题 public class Demo01 public static void
  • MPI > Ubuntu22.04安装MPICH4.0.2并行平台

    MPICH4 0 2 MPICH4 0 2 环境 下载 安装 环境变量 测试单机环境 准备多机环境 配置MPI多机环境 MPICH4 0 2 搭建PSRS Parallel Sorting by Regular Sampling 算法运行环
  • 《数据挖掘导论》归纳笔记

    目录 第一章 绪论 第二章 数据 2 0引言 2 0 1数据类型 2 0 2数据的质量 2 0 3使数据适合挖掘的预处理步骤 2 0 4根据数据联系分析数据 2 1数据类型 2 1 1 属性与度量 2 1 2 数据集的类型 2 2数据质量
  • android 内存溢出前退出界面,Android 导航(介绍)页面ViewPager内存溢出解决方法...

    现在基本每个Android App都会标配一个启动介绍的页面 或做产品介绍 或做app功能展示 既然起导航界面 基本思路就是用ViewPager实现 图片引自UI中国一设计师的设计图片 正好这几天在做这个导航界面 我的测试手机是魅族MX3