牂牁思三贤 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

    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器