加载图片时出现OutOfMemoryError

时间:2018-03-12 22:39:33

标签: android image android-recyclerview picasso

我正在开发一个项目,该项目使用一系列图片网址并将其加载到recyclerview网格中。图像可以是任何分辨率,应用程序在加载6张图像后崩溃。我认为使用毕加索会解决问题,但这不起作用。该应用程序现在速度较慢,并且recyclelerview滚动是滞后的,而在崩溃之前它最多只加载3-4个图像。

内存泄漏:

    public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>{
    LayoutInflater inflater;

    public RecyclerViewAdapter(Context c){
        inflater=LayoutInflater.from(c);
    }

    @NonNull
    @Override
    public RecyclerViewAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = inflater.inflate(R.layout.recyclerview_item,parent,false);
        itemView.setMinimumHeight(150);
        return new ViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerViewAdapter.ViewHolder holder, int position) {
        if(urls!=null){
        //Uri uri = Uri.parse(urls.get(position));
        //Toast.makeText(getContext(),""+urls.get(position),Toast.LENGTH_SHORT).show();
        Picasso.with(context)
                .load(urls.get(position))
                .into(holder.view);
        }
    }

    @Override
    public int getItemCount() {
        if(urls != null)
            return urls.size();
        else
            return 0;
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        ImageView view;

        public ViewHolder(View itemView) {
            super(itemView);
            view=itemView.findViewById(R.id.image_recycler);
        }

        @Override
        public void onClick(View v) {

        }
    }
}

3 个答案:

答案 0 :(得分:0)

试试Glide库。它非常有效: https://github.com/bumptech/glide

答案 1 :(得分:0)

这是来自毕加索的官方网站,它会缩小图像尺寸。如果这样可行则问题是图像尺寸太大

  

您还可以为更高级的效果指定自定义转换。

public class CropSquareTransformation implements Transformation {
  @Override public Bitmap transform(Bitmap source) {
    int size = Math.min(source.getWidth(), source.getHeight());
    int x = (source.getWidth() - size) / 2;
    int y = (source.getHeight() - size) / 2;
    Bitmap result = Bitmap.createBitmap(source, x, y, size, size);
    if (result != source) {
      source.recycle();
    }
    return result;
  }

  @Override public String key() { return "square()"; }
}
  

将此类的实例传递给transform方法。

答案 2 :(得分:0)

 <application
    android:allowBackup="true"
    android:icon="@drawable/app_icon"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:largeHeap="true"
    android:theme="@style/AppTheme"/>

在清单文件中使用largeHeap =“true”。