加载图像时出现 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"。
我正在开发一个项目,该项目使用一系列图像 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"。