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
原创粉丝点击