Android:如何重用或限制位图的数量
Posted
技术标签:
【中文标题】Android:如何重用或限制位图的数量【英文标题】:Android: How to resuse or limit amount of Bitmap 【发布时间】:2021-12-18 22:46:49 【问题描述】:我确实有一个应用程序可以显示来自 firebase-Realtime 的图像和其他一些文本信息, 我的应用程序内存使用存在问题,它可以轻松跨越 400+mb 所以我使用分析器检查并解决了我的应用程序的每个 MemoryLeaks,现在当我检查 android Studio 分析器时,我发现有大量位图正在使用大量内存。
AlSO Iam 正在使用 Picasso 从适配器内将图像加载到 Recycleview 中
有时也使用 Glide
所以我想知道是否可以解决这些位图内存使用问题,或者是否可以限制可以使用的位图数量,因为每次显示新图像时,应用程序都会制作一个新位图并使用更多公羊。
将图像加载到 recyclerview 的适配器代码:
public class HomeScreenWorkViewHolder extends RecyclerView.ViewHolder
View view;
DatabaseReference likeReference;
public ImageView like_btn;
public TextView like_text;
public HomeScreenWorkViewHolder(@NonNull View itemView)
super(itemView);
like_btn = itemView.findViewById(R.id.like_btn);
like_text = itemView.findViewById(R.id.like_text);
view = itemView;
public HomeScreenWorkViewHolder(@NonNull View itemView, OnItemClick callBack)
super(itemView);
like_btn = itemView.findViewById(R.id.like_btn);
like_text = itemView.findViewById(R.id.like_text);
view = itemView;
itemView.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
callBack.onItemClicked(getAdapterPosition());
);
public void setdetails( String name, String image, String description, String location)
TextView mtitletv = view.findViewById(R.id.product_layout_name);
TextView mdesrcriptiontv = view.findViewById(R.id.product_layout_description);
TextView mlocationtv = view.findViewById(R.id.product_layout_location);
ImageView mImagetv = view.findViewById(R.id.product_layout_image);
mtitletv.setText(name);
mdesrcriptiontv.setText(description);
mlocationtv.setText(location);
Picasso.get().load(image).placeholder(R.drawable.ic_baseline_cloud_download_24).into(mImagetv);
【问题讨论】:
【参考方案1】:听起来您要么保留对位图的引用。如果不是这种情况,但您试图将引用保留在内存中,但通过更改样本大小来减少内存占用。
采样大小可以这样认为:如果您有一个 1000x1000 的图像,每像素 8 位.. 您有一个 1,000,000 字节的图像加载到内存中。假设您只需要 100x100 的缩略图。然后,您可以将采样大小更改为 10,它会每隔 10 个像素从文件中读取一次,从而构建一个更新/更小的内存占用图像。这将从 1,000,000 字节变为 10,000 字节。
试试这个 SO question 的答案..
Strange OutOfMemory issue while loading an image to a Bitmap object
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 8;
Bitmap preview_bitmap = BitmapFactory.decodeStream(is, null, options);
【讨论】:
我正在使用 Picasso 和 glide 将图像加载到 recycleview 中,因此我的代码中没有使用位图 我认为 Picasso 和 Glide 都内置了调整大小或压缩的方法 用适配器代码检查我更新的问题 Bitmaps 基本上是 Picasso & Glide 中的底层结构..(屏幕上的所有 android 图像,如果没有记错的话)以上是关于Android:如何重用或限制位图的数量的主要内容,如果未能解决你的问题,请参考以下文章
Volley 库中是不是有任何限制来获取 Android 上的数据数量?