加载图像时出现 OutOfMemoryError

OutOfMemoryError while loading images

我正在开发一个项目,该项目使用一系列图像 url 并将它们加载到 recyclerview 网格中。图片可以是任何分辨率,应用程序在仅加载 6 张图片后崩溃。我认为使用 Picasso 可以解决问题,但没有用。该应用程序现在速度较慢,recyclerview 滚动缓慢,而它在崩溃前最多仅加载 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) {

        }
    }
}

试试 Glide 库。这真的很有效: https://github.com/bumptech/glide

来自毕加索官网,会缩小图片尺寸。如果这可行,那么问题是您的图像尺寸太大

You can also specify custom transformations for more advanced effects.

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()"; }
}

Pass an instance of this class to the transform method.

 <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"。