牂牁思三贤 2016-10-06 18:59 采纳率: 0%
浏览 1915

Android使用ViewPager实现本地相册,图片太多内存溢出,如何解决?

用viewpager实现相册,由于加载的图片量很多,造成内存溢出。我在网上找了半天,然后修改了方法,在适配器中用了异步加载图片,并且每次用了还销毁了。但是随着图片的增加,内存占用量越来越大。直到图片为24张的时候,内存超过100M,程序就崩溃了。现在又在AndroidManifest.xml中加了android:largeHeap="true",加载31张图片没有问题。但是,我想知道,有没有减少内存使用的好办法。为什么我用的异步加载,删除了视图,却没有减少内存的使用量?
我简要说明一下我的做法,扫描得到某一个文件夹里的文件。得到文件的个数N,然后添加N个视图。在PagerAdapter的instantiateItem中异步加载图片。
public class MainActivity extends Activity {

private ViewPager viewPager;
private List<View> views;
File[] files;
String save_path ,path;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.main);

    viewPager = (ViewPager) findViewById(R.id.viewPager);
    File defaultDir = Environment.getExternalStorageDirectory();
    path = defaultDir.getAbsolutePath()+File.separator+"DCIM"+File.separator+"Screenshots"+File.separator;
    File f_path = new File(path);
    if(!f_path.exists()){
        f_path.mkdir();
    }
    views = new ArrayList<View>();
    files = f_path.listFiles();
    int N = files.length;
    Log.i("info", "N = "+N);
    for (int i = 0; i < N; i++) {
        ImageView image=new ImageView(this);
        views.add(image);

    }

    PagerAdapter mPagerAdapter = new PagerAdapter(){

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            ImageView view=(ImageView) views.get(position);  
            String item=files[position].getName();
            Log.i("info", position+"图片名:"+item);  
            Bitmap bitmap = null;  
            try  
            {  
                File file = new File(path+item);  
                if(file.exists())  
                {  
                    BitmapFactory.Options options = new BitmapFactory.Options();
                    options.inPreferredConfig=null;
                    options.inPurgeable = true;
                    options.inInputShareable = true;
                    bitmap = BitmapFactory.decodeFile(path+item,options);  
                }  
            } catch (Exception e)  
            {  
                Log.i("info", "异常:"+e);  
            }
            view.setImageBitmap(bitmap);
            container.removeView(views.get(position));
            container.addView(views.get(position));  

            return views.get(position); 
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return views.size();
        }

        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
            // TODO Auto-generated method stub
            return arg0==arg1;
        }

        @Override
        public void destroyItem(View container, int position, Object object) {
            ((ViewPager) container).removeView((View)object);

        }
    };
    viewPager.setAdapter(mPagerAdapter);
}

}

  • 写回答

2条回答 默认 最新

  • C盘无限大 2016-10-07 03:17
    关注

    在instantiateItem方法添加内存缓存,内存有该图片就不要再decodeFile,同时使用viewpager.setOffscreenPageLimit(2)预加载左右两个view

    评论

报告相同问题?

悬赏问题

  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元