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:如何重用或限制位图的数量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中重复或重用 Activity

在 Android 中将位图转换为灰度

如何找出GPS坐标附近的医院数量?

Volley 库中是不是有任何限制来获取 Android 上的数据数量?

如何通过android中的软键盘以编程方式将我的EditText输入限制为反斜杠(/),tild(〜)等特殊字符

在 Android 中动态且顺序地用颜色填充图像视图或位图