ViewPager或ImgeView加载图片出现内存溢出(OOM)
来源:互联网 发布:预防数据库死锁的方法 编辑:程序博客网 时间:2024/04/27 17:02
最近碰到一个挺烦人的问题,一开始感觉非常的诡异,在小米4和一台华为的机子上欢迎页出现莫名的崩溃。经过查看log后发现是内存溢出的问题,我当时就有点懵了,就这么一张图片的大小就会造成内存溢出?然后就去网上查资料了解到:使用setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。解决方案:改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的 source。decodeStream最大的优势在于其直接调用nativeDecodeAsset()来完成decode,无需再使用java层的createBitmap,从而节省了java层的空间。
1.XML代码
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:id="@+id/linearLayout01" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <android.support.v4.view.ViewPager android:id="@+id/guidePages" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout><LinearLayout android:id="@+id/dot_layout" android:layout_width="fill_parent" android:layout_height="100dip" android:layout_gravity="bottom" android:background="@null" android:gravity="center" android:orientation="vertical" > <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="20dp" android:layout_marginTop="10dip" android:gravity="center" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" > <View android:id="@+id/sweet_v_dot0" style="@style/dot_style" /> <View android:id="@+id/sweet_v_dot1" style="@style/dot_style" /> <View android:id="@+id/sweet_v_dot2" style="@style/dot_style" /> <View android:id="@+id/sweet_v_dot3" style="@style/dot_style" /> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" > <View android:id="@+id/sweet_t_dot0" style="@style/dot_style" android:background="@drawable/dot_focused" /> <View android:id="@+id/sweet_t_dot1" style="@style/dot_style" android:background="@drawable/dot_focused" /> <View android:id="@+id/sweet_t_dot2" style="@style/dot_style" android:background="@drawable/dot_focused" /> <View android:id="@+id/sweet_t_dot3" style="@style/dot_style" android:background="@drawable/dot_focused" /> </LinearLayout> </RelativeLayout> </LinearLayout></LinearLayout>2.java代码
package com.example.viewpager_demo;import java.io.InputStream;import java.util.ArrayList;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Bitmap.Config;import android.os.Bundle;import android.os.Parcelable;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;import android.view.LayoutInflater;import android.view.View;import android.widget.Button;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ImageView.ScaleType;public class MainActivity extends Activity {protected ViewPager guidePages;protected ArrayList<View> views;protected ArrayList<View> dots;protected ArrayList<View> dots1;LinearLayout dot_layout;protected int currentItem = 0;protected Button gotiyan;int[] array = { R.drawable.welcome01, R.drawable.welcome02,R.drawable.welcome03, R.drawable.welcome04 };@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.main);guidePages = (ViewPager) findViewById(R.id.guidePages);dot_layout = (LinearLayout) findViewById(R.id.dot_layout);LayoutInflater inflater = getLayoutInflater();dots = new ArrayList<View>();dots.add(findViewById(R.id.sweet_v_dot0));dots.add(findViewById(R.id.sweet_v_dot1));dots.add(findViewById(R.id.sweet_v_dot2));dots.add(findViewById(R.id.sweet_v_dot3));dots1 = new ArrayList<View>();dots1.add(findViewById(R.id.sweet_t_dot0));dots1.add(findViewById(R.id.sweet_t_dot1));dots1.add(findViewById(R.id.sweet_t_dot2));dots1.add(findViewById(R.id.sweet_t_dot3));for (int i = 0; i < dots1.size(); i++) {dots1.get(i).setVisibility(View.INVISIBLE);}currentItem = 0;dots1.get(currentItem).setVisibility(View.VISIBLE);views = new ArrayList<View>();for(int i=0;i<4;++i){ImageView image=new ImageView(this);views.add(image);}guidePages.setAdapter(new MyAdapter());guidePages.setOnPageChangeListener(new MyPageChangeListener());}private class MyPageChangeListener implements OnPageChangeListener {private int oldPosition = 0;@Overridepublic void onPageSelected(int arg0) {// TODO Auto-generated method stubcurrentItem = arg0;if (currentItem == 3) {dot_layout.setVisibility(View.GONE);} else {dot_layout.setVisibility(View.VISIBLE);}dots1.get(oldPosition).setVisibility(View.INVISIBLE);dots1.get(currentItem).setVisibility(View.VISIBLE);oldPosition = arg0;}@Overridepublic void onPageScrollStateChanged(int arg0) {// TODO Auto-generated method stub}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {// TODO Auto-generated method stub}}private class MyAdapter extends PagerAdapter {@Overridepublic int getCount() {return views.size();}@Overridepublic Object instantiateItem(View arg0, int arg1) {ImageView imageview=(ImageView) views.get(arg1);imageview.setScaleType(ScaleType.FIT_XY);BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inPreferredConfig =Config.RGB_565; opt.inPurgeable = true; opt.inInputShareable = true; InputStream is = getResources().openRawResource(array[arg1]); Bitmap tmpbmp=BitmapFactory.decodeStream(is, null, opt); imageview.setImageBitmap(tmpbmp);((ViewPager) arg0).addView(imageview);return views.get(arg1);}@Overridepublic void destroyItem(View arg0, int arg1, Object arg2) {((ViewPager) arg0).removeView((View) arg2);}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {return arg0 == arg1;}@Overridepublic void restoreState(Parcelable arg0, ClassLoader arg1) {}@Overridepublic Parcelable saveState() {return null;}@Overridepublic void startUpdate(View arg0) {}@Overridepublic void finishUpdate(View arg0) {}}}Demo下载地址:http://download.csdn.net/detail/u012720262/9424512
0 0
- ViewPager或ImgeView加载图片出现内存溢出(OOM)
- Android内存溢出整理总结 OOM(Out Of Memory) 加载的图片太多或图片过大时经常出现OOM问题
- Android内存溢出整理总结 OOM(Out Of Memory) 加载的图片太多或图片过大时经常出现OOM问题
- ViewPager加载多张图片出现内存溢出的解决办法
- Android网络图片加载内存溢出(OOM)解决方案
- 加载大图片导致OOM异常 OOM:内存溢出(图片太大导致)
- [安卓开发] ImageView加载图片内存溢出oom解决方案
- 加载图片出现OOM
- Android加载图片出现内存溢出攻略
- Android加载图片出现内存溢出攻略
- 加载首页图片出现内存溢出
- OOM----内存溢出或内存泄漏
- android 解决ViewPager加载大量图片内存溢出问题
- 关于ViewPager加载多个导致OOM内存溢出的问题。
- android加载图片出现OOM
- 图片加载内存溢出
- android图片加载内存优化方法,有效解决大图片内存溢出(oom)
- 防止图片decode时候(内存溢出)oom
- iOS笔记 复习Category和Extension
- Deep Belief Networks资料汇总
- mysql中聚合函数条件
- 关于XAMPP下使用PHPBB或者Discuz!
- JQUERY基础知识总结
- ViewPager或ImgeView加载图片出现内存溢出(OOM)
- 安卓开发1--搭建最新开发环境及新建项目检测
- java读取properties文件的几种方法
- sqlserver数据库收缩日志并限制最大增长
- Google官方Android API指南索引
- 【Lua】观察者模式在Lua中的实现
- Unique ID的特性需求分析
- JVM垃圾收集
- 文件和目录