viewPager--viewpager时,发生内存溢出OOM问题
两个问题:
1、如果图片达到500kb每张,你这个划屏会有顿卡;
2、快速滑动有出现0.几秒的白屏。图片越大,顿卡越明显。
回复parcool:500kb的背景算大的了,如果是想做图片墙,viewpager不适合,可以使用开源的图片墙工具,内存+硬盘缓存
还有哦,你这个图片根本没有手动回收,依然会OOM!
今天在制作应用某个功能的引导页时,使用了ViewPager进行页面切换,每个页面就放了一个ImageView,使用背景图来进行展示,由于多图(11张)的原因,导致了OOM问题,这里总结一下。
代码如下:
- public class GuideActivity extends Activity implements OnPageChangeListener{
- private ViewPager viewPager;
- private GuideAdapter adapter;
- private LinearLayout dotContain;
- private Button btnSure;
- private List<View> mViews=new ArrayList<View>();
- private int[] mResIds=new int[]{
- R.drawable.step01,
- R.drawable.step02,
- R.drawable.step03,
- R.drawable.step04,
- R.drawable.step05,
- R.drawable.step06,
- R.drawable.step07,
- R.drawable.step08,
- R.drawable.step09,
- R.drawable.step10,
- R.drawable.step11
- };
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- setContentView(R.layout.activity_guide);
- initViews();
- initDatas();
- }
- protected void initViews() {
- viewPager=(ViewPager) findViewById(R.id.vp_guide);
- dotContain=(LinearLayout) findViewById(R.id.layout_dot_contain);
- btnSure=(Button) findViewById(R.id.btn_sure);
- adapter=new GuideAdapter(mViews);
- }
- protected void initDatas() {
- for (int i = 0; i < mResIds.length; i++) {
- ImageView img=new ImageView(this);
- //延迟设置图片,在PagerAdapter内设置,解决OOM问题
- /*ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT);
- img.setBackgroundResource(mResIds[i]);
- img.setLayoutParams(params);*/
- mViews.add(img);
- }
- viewPager.setAdapter(adapter);
- viewPager.setOnPageChangeListener(this);
- viewPager.setCurrentItem(0);
- viewPager.setOffscreenPageLimit(1);
- dotContain.getChildAt(0).setSelected(true);
- }
- /**
- *
- * 2014-12-19 上午10:56:19
- * @param position
- * @TODO 改变底部图标状态
- */
- private void chageDotState(final int position){
- int count=dotContain.getChildCount();
- for (int i = 0; i < count; i++) {
- View view=dotContain.getChildAt(i);
- if(position%count==i){
- view.setSelected(true);
- }else{
- view.setSelected(false);
- }
- }
- }
- /**
- *
- * @Create_date 2014-12-19 上午11:09:48
- * @TODO 适配器
- */
- class GuideAdapter extends PagerAdapter{
- private List<View> views;
- public GuideAdapter(List<View> views) {
- this.views = views;
- }
- @Override
- public int getCount() {
- return views.size();
- }
- @Override
- public boolean isViewFromObject(View arg0, Object arg1) {
- return arg0==arg1;
- }
- @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=views.get(position);
- int count=getCount();
- ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT);
- view.setBackgroundResource(mResIds[position%count]);
- view.setLayoutParams(params);
- container.addView(view,0);
- return views.get(position);
- }
- }
- @Override
- public void onPageScrollStateChanged(int arg0) {
- }
- @Override
- public void onPageScrolled(int arg0, float arg1, int arg2) {
- }
- @Override
- public void onPageSelected(int arg0) {
- if(arg0<adapter.getCount()-1){
- dotContain.setVisibility(View.VISIBLE);
- btnSure.setVisibility(View.GONE);
- chageDotState(arg0);
- }else{
- dotContain.setVisibility(View.GONE);
- btnSure.setVisibility(View.VISIBLE);
- }
- }
- }
代码中已经进行了说明。一开始,使用了一个for循环,将所有的ImageView设置了背景并添加到List<View>中,这样导致,一点进这个界面时,有点卡顿,并且有时还会出现OOM问题。
解决办法就是:在for循环内只将ImageView对象添加到List<View>中,并不对其设置背景资源,将该步骤延迟到PagerAdapter$instantiateItem()中再进行设置。
说明:页面过多会报OOM的原因是,当ImageView在调用setBackgroundResource时,底层会调用BitmapFactory.decodeResource进行解码,而这个过程是耗时的,也很容易就OOM了,因此在for循环内进行多图设置的话就导致卡顿甚至OOM了。
viewPager--viewpager时,发生内存溢出OOM问题的更多相关文章
- 内存溢出(Oom)和内存泄露(Memory leak)
1.概念 内存溢出(Oom):1.内存不够用:2.数据长度短的数据类型存储了一个数据长度较大的数据类型:3.一个结果 内存泄露(Memory leak):1.忘记释放已用内存,内存管理较为常见的现象: ...
- JVM:内存溢出OOM
JVM:内存溢出OOM 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 经典错误 JVM 中常见的两个 OOM 错误 StackoverflowError:栈溢出 ...
- 内存溢出(OOM)分析
当JVM内存不足时,会抛出java.lang.OutOfMemoryError. 主要的OOM类型右: Java heap space:堆空间不足 GC overhead limit exceed ...
- 如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码
程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习< ...
- 将 expression 转换为数据类型 int 时发生算术溢出
将 expression 转换为数据类型 int 时发生算术溢出错误 2种快速处理方法 1.CONVERT(bigint, 字段名): 2.Cast(字段名 as decimal(18,2)): 这个 ...
- 将expression转化为数据类型int时发生算术溢出错误
在SQL Server 中,某列的数据都在int范围之内,但是使用sum聚集函数求该列和的时候,出现“将expression转化为数据类型int时发生算术溢出错误”. 问题在于定义的数据类型: 首先, ...
- 解决Vue编译和打包时频繁内存溢出情况CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
解决Vue编译和打包时频繁内存溢出情况CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 如上图所示:频繁出现此 ...
- 内存溢出OOM与内存泄漏ML
附, 微信团队原创分享:Android内存泄漏监控和优化技巧总结 一.如何避免OOM 异常 想要避免OOM 异常首先我们要知道什么情况下会导致OOM 异常. 1.图片过大导致OOM Android 中 ...
- java常见内存溢出(OOM)
jvm内存区域 程序计数器一块很小的内存空间,作用是当前线程所执行的字节码的行号指示器. java栈与程序计数器一样,java栈(虚拟机栈)也是线程私有的,其生命周期与线程相同.通常存放基本数据类型, ...
随机推荐
- CoInitialize浅析二
最近工作比较忙,在粗略分析了CoInitialize之后我们一直没有再深入研究,下面言归正传.前面我们初步了解到了CoInitialize其实是通过调用CoInitializeEx来实现功能的,而后者 ...
- centos安装与卸载postgresql
1.卸载旧版本postgresql $ yum remove postgresql* 2.更新yum $ yum update 3.下载pgdg-centos92-9.2-6.noarch.rpm,或 ...
- CentOS7下安装MySQL5.7安装与配置(转)
原文地址:http://www.centoscn.com/mysql/2016/0626/7537.html 安装环境:CentOS7 64位 MINI版,安装MySQL5.7 1.配置YUM源 在M ...
- LoadRunner迭代与并发的理解
---恢复内容开始--- 四车道的马路,如果只有四辆车并排走过就是并发: 如果四辆车排成一纵队走过就是迭代: 如果有100辆车排成25行依次走过就是并发加迭代. 在以上说法中,只有并排的车是我们 ...
- (整理) Json语法规则
{ "staff":[ {"name":"haha1", "age":20}, {"name":&q ...
- nodeType、nodeName和nodeValue
首先了解一下DOM中有三大节点,分别是 元素节点,文本节点,属性节点 元素节点:构成了DOM的基础.文档结构中,<html>是根元素,代表整个文档,其他的还有<head>,&l ...
- socket实现手机连接网络打印机打印pos单
打印的工具类: public class PrintLine { String TAG = "xxl"; static String PRINT_IP = "192. ...
- 转:在Android中使用AlarmManager
原地址http://blog.csdn.net/maosidiaoxian/article/details/21776697 AlarmManager是Android中的一种系统级别的提醒服务,它会为 ...
- SVN-Server搭建及配置
SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Subversion ...
- android-APP-bluetooth
1.创建工程项目 2.工程界面(教程3) 如下目录所示:src目录下MainActivity.java是程序:res下面都是图标等资源文件,layout下的activity_main.xml是按钮等界 ...