使用ViewPager时的OOM问题解决

来源:互联网 发布:潜艇模型 淘宝 编辑:程序博客网 时间:2024/06/09 17:53

最近在写项目过程中遇到这样一个问题。一个用viewPager制作的APP启动引导页,其内容只有一个imageView,而且每个imageView的平均为100K左右,该项目在720P手机上运行完全正常。但是在换到1080P手机上运行的时候却给博主抛出了结结实实的一记OOM,顿时让我懵逼不已,问题被锁定在了imageview的setbackgroundresourse()方法中。viewpager中,我用for循环依次创建了4个imageview对象并且依次添加到viewpager所对应的list集合中。如代码中被注释的语句。后为解决该问题,改为在for循环中只是单纯实例化四个imageview对象而原来的setbackgroundresourse()操作被放在了viewpager的

public Object instantiateItem(ViewGroup container, int position) {            imageViews.get(position).setImageResource(imageId[position]);            container.addView(imageViews.get(position));            return imageViews.get(position);        }

中进行。如此之后OOM即可解决。

全部代码如下

package com.example.xiaom.activities;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.util.Log;import android.view.View;import android.view.ViewGroup;import android.view.ViewTreeObserver;import android.widget.Button;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.RelativeLayout;import com.example.xiaom.myplugins.TitleLayout;import com.example.xiaom.utils.FirstLaunchSharePerenferens;import java.util.ArrayList;public class user_first_guide extends Activity {    private static final int []imageId={R.drawable.guide_1,            R.drawable.guide_2,            R.drawable.guide_3,            R.drawable.guide_4};    private ViewPager viewPager;    private ArrayList<ImageView> imageViews;    private Button btn_start;    private LinearLayout linearLayout;    private View point_white;    private int wid;    private RelativeLayout relativeLayout1;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_user_first_guide);        InitView();        setAdapter();        setListener();    }    private void setListener() {        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {            @Override            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {                RelativeLayout.LayoutParams relativeLayout = (RelativeLayout.LayoutParams) point_white.getLayoutParams();                relativeLayout.leftMargin = (int)(position * wid + wid * positionOffset);                relativeLayout1 = (RelativeLayout) findViewById(R.id.rl_points);                point_white.setLayoutParams(relativeLayout);            }            @Override            public void onPageSelected(int position) {                if (position == imageId.length - 1){                    btn_start.setVisibility(View.VISIBLE);                }else {                    btn_start.setVisibility(View.INVISIBLE);                }            }            @Override            public void onPageScrollStateChanged(int state) {            }        });        btn_start.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent intent = new Intent(user_first_guide.this, MainActivity.class);                startActivity(intent);                FirstLaunchSharePerenferens.isFirstLaunch(user_first_guide.this,false);                finish();            }        });    }    private void setAdapter() {        MyViewPagerAdapter myViewPagerAdapter = new MyViewPagerAdapter();        viewPager.setAdapter(myViewPagerAdapter);    }    private void InitView() {        imageViews = new ArrayList<>();        viewPager = (ViewPager) findViewById(R.id.vp_guide);        point_white = findViewById(R.id.guide_point_white);        btn_start = (Button) findViewById(R.id.btn_start);        linearLayout = (LinearLayout) findViewById(R.id.ll_guide_point);        for (int i = 0; i < imageId.length; i ++){            ImageView imageView = new ImageView(this);//            imageView.setBackgroundResource(imageId[i]);            imageViews.add(imageView);        }        for (int i = 0; i < imageId.length; i ++){            View view  = new View(this);            view.setBackgroundResource(R.drawable.guide_line_blue);            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(10,10);            view.setLayoutParams(layoutParams);            if (i > 0){                layoutParams.leftMargin = 10;            }            linearLayout.addView(view);        }        linearLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {            @Override            public void onGlobalLayout() {                linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);                wid = linearLayout.getChildAt(1).getLeft() - linearLayout.getChildAt(0).getLeft();                Log.d("width", wid +"");            }        });    }    class MyViewPagerAdapter extends PagerAdapter {        @Override        public int getCount() {            return imageViews.size();        }        @Override        public boolean isViewFromObject(View view, Object object) {            return view==object;        }        @Override        public Object instantiateItem(ViewGroup container, int position) {            imageViews.get(position).setImageResource(imageId[position]);            container.addView(imageViews.get(position));            return imageViews.get(position);        }        @Override        public void destroyItem(ViewGroup container, int position, Object object) {            container.removeView((View)object);        }    }}

0 0