Java.lang.outofMemory错误

时间:2016-12-20 06:33:07

标签: android android-viewpager

我正在创建一个图像滑块,我知道这会以某种方式发生,因为我使用的图像,我已经尝试android:largeHeap="true"但我没有运气。

这是我输出图像的适配器代码

 public class EsquireAdapter extends PagerAdapter {

    private int [] imgs = { R.drawable.conf4,R.drawable.food,R.drawable.food1,R.drawable.food2,R.drawable.conf4,R.drawable.food,R.drawable.food1,R.drawable.food2,R.drawable.escalope,};
    private LayoutInflater inflater;
    private Context ctxt;

    public EsquireAdapter(Context ctxt) {
        this.ctxt = ctxt;
    }


    @Override
    public int getCount() {
        return imgs.length;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        inflater = (LayoutInflater)ctxt.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflater.inflate(R.layout.swipee,container,false);
        ImageView img = (ImageView)v.findViewById(R.id.ImageView);
        TextView tv = (TextView)v.findViewById(R.id.textView);
        img.setImageResource(imgs[position]);

        container.addView(v);
        return v;

    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.invalidate();
    }
}

这是我的logcat:

  

致命的例外:主要                                                                                   处理:com.example.moses.ngongapp,PID:21333                                                                                   java.lang.OutOfMemoryError:无法分配带有16777120个空闲字节的144764940字节分配和27MB直到OOM                                                                                       at dalvik.system.VMRuntime.newNonMovableArray(Native Method)                                                                                       在android.graphics.BitmapFactory.nativeDecodeAsset(本机方法)                                                                                       在android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:609)

2 个答案:

答案 0 :(得分:1)

发生这种情况的原因是,由于文件较大,提供给您应用的内存会被图像用尽。
在这种情况下,启用大型堆不会是一个解决方案,因为它只会为您的应用程序提供一些额外的内存来处理,最终也会被耗尽。
您可以在这里尝试的解决方案很少

  1. 缩放图片:https://developer.android.com/training/displaying-bitmaps/load-bitmap.html
  2. 如果您不想手动编写用于缩放图片的代码,请使用Picasso这样的库。这是一个快速的tutorial on Picasso

    Picasso  
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[0])
    .fit()
    // call .centerInside() or .centerCrop() to avoid a stretched image
    .into(imageViewFit);
    
  3. Picasso中的.fit()方法可以为您缩放图像。

答案 1 :(得分:1)

我建议您使用名为Glide的库,使用此库在gradle文件中添加以下内容

dependencies {
  compile 'com.github.bumptech.glide:glide:3.7.0'
}

然后在res文件夹中创建一个名为drawable-nodpi的文件夹。将所有图像放在那里

然后在instantiateItem执行以下操作

@Override
public Object instantiateItem(ViewGroup container, int position) {
    inflater = (LayoutInflater)ctxt.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View v = inflater.inflate(R.layout.swipee,container,false);
    ImageView img = (ImageView)v.findViewById(R.id.ImageView);
    TextView tv = (TextView)v.findViewById(R.id.textView);

    Glide.with(context)
     .load(imgs[position])
     .asBitmap()‌​.transform(new CenterCrop(context))
     .diskCacheStrategy( DiskCacheStrategy.NONE )
     .skipMemoryCache( true )
     .int‌​o(img)

    container.addView(v);
    return v;

}

让我知道它是否有效