Android TextView动态地加载资源文件,避免Native 层内存泄漏或内存溢出

news/2025/3/21 13:13:08/

在 Android 中,如果使用 TextViewsetBackgroundResource() 方法设置背景,可能会导致 Native 层内存增长。这是因为 setBackgroundResource() 方法会将资源文件(例如图片)加载到内存中,如果频繁地调用该方法,就会导致内存泄漏或内存溢出。

为了避免这种问题,可以使用 TextViewsetBackgroundDrawable() 方法来设置背景。这个方法不会将资源文件加载到内存中,而是在需要时动态地加载资源文件,从而避免了内存泄漏或内存溢出的问题。

以下是使用 setBackgroundDrawable() 方法设置 TextView 背景的示例代码:

TextView textView = findViewById(R.id.text_view);
Drawable drawable = getResources().getDrawable(R.drawable.background);
textView.setBackgroundDrawable(drawable);

在上面的示例代码中,getDrawable() 方法返回一个 Drawable 对象,它代表了一个资源文件(例如图片)的抽象表示。然后,使用 setBackgroundDrawable() 方法将该 Drawable 对象设置为 TextView 的背景。

需要注意的是,从 Android 5.0 开始,setBackgroundDrawable() 方法已经被废弃。取而代之的是 setBackground() 方法,它可以接受一个 Drawable 对象或者一个资源文件的 ID。因此,可以使用以下代码来设置 TextView 背景:

TextView textView = findViewById(R.id.text_view);
Drawable drawable = getResources().getDrawable(R.drawable.background);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {textView.setBackground(drawable);
} else {textView.setBackgroundDrawable(drawable);
}

在上面的代码中,首先使用 getDrawable() 方法获取 Drawable 对象,然后根据 Android 版本判断使用 setBackground() 方法还是 setBackgroundDrawable() 方法来设置背景。这样可以保证在不同版本的 Android 系统上都能正确地设置 TextView 背景,同时也避免了 Native 层内存增长的问题。

高版本

针对高版本方法过期问题,使用如下方法:

holder.tvNewHumi.setBackground(ResourcesCompat.getDrawable(requireActivity.getResources(),R.drawable.alert_animation,null));

频繁调用,会导致 Native 层内存增长方法整理

在 Android 中,TextView 有一些方法,如果频繁调用,会导致 Native 层内存增长。这些方法包括:

  1. setText() 方法

setText() 方法用于设置 TextView 的文本内容。如果频繁地调用该方法,就会导致 Native 层内存增长。这是因为 setText() 方法会将字符串转换成 Unicode 编码,并将其存储在 Native 层的内存中。如果频繁地调用该方法,就会导致 Native 层内存的增长。

例如,以下代码使用 setText() 方法设置 10000 次文本内容:

TextView textView = findViewById(R.id.text_view);
for (int i = 0; i < 10000; i++) {textView.setText("Hello World!");
}

这段代码会导致 Native 层内存的增长,因为每次调用 setText() 方法都会在 Native 层中分配内存。

为了避免这种问题,可以使用 StringBuilder 来拼接字符串,最后再一次性地调用 setText() 方法来设置 TextView 的文本内容。这样可以减少 Native 层内存的使用。

例如,以下代码使用 StringBuilder 来拼接字符串,最后再一次性地调用 setText() 方法设置文本内容:

TextView textView = findViewById(R.id.text_view);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {sb.append("Hello World!\n");
}
textView.setText(sb.toString());

这段代码只会在 Native 层中分配一次内存,可以有效地减少 Native 层内存的使用。

  1. setBackgroundResource() 方法

setBackgroundResource() 方法用于设置 TextView 的背景。如果频繁地调用该方法,就会导致 Native 层内存增长。这是因为 setBackgroundResource() 方法会将资源文件(例如图片)加载到内存中,如果频繁地调用该方法,就会导致内存泄漏或内存溢出。

例如,以下代码使用 setBackgroundResource() 方法设置 10000 次背景:

TextView textView = findViewById(R.id.text_view);
for (int i = 0; i < 10000; i++) {textView.setBackgroundResource(R.drawable.background);
}

这段代码会导致 Native 层内存的增长,因为每次调用 setBackgroundResource() 方法都会将资源文件加载到内存中。

为了避免这种问题,可以使用 setBackgroundDrawable() 方法来设置背景。这个方法不会将资源文件加载到内存中,而是在需要时动态地加载资源文件,从而避免了内存泄漏或内存溢出的问题。

例如,以下代码使用 setBackgroundDrawable() 方法设置背景:

TextView textView = findViewById(R.id.text_view);
Drawable drawable = getResources().getDrawable(R.drawable.background);
textView.setBackgroundDrawable(drawable);

这段代码不会导致 Native 层内存的增长。

  1. setCompoundDrawables() 方法

setCompoundDrawables() 方法用于设置 TextView 的左、上、右、下四个方向的图标。如果频繁地调用该方法,就会导致 Native 层内存增长。这是因为 setCompoundDrawables() 方法会将图标加载到内存中,如果频繁地调用该方法,就会导致内存泄漏或内存溢出。

例如,以下代码使用 setCompoundDrawables() 方法设置 10000 次图标:

TextView textView = findViewById(R.id.text_view);
Drawable drawable = getResources().getDrawable(R.drawable.icon);
for (int i = 0; i < 10000; i++) {textView.setCompoundDrawables(drawable, null, null, null);
}

这段代码会导致 Native 层内存的增长,因为每次调用 setCompoundDrawables() 方法都会将图标加载到内存中。

为了避免这种问题,可以使用 setCompoundDrawablesWithIntrinsicBounds() 方法来设置图标。这个方法会根据图标的实际大小来设置 TextView 的大小,从而避免了内存泄漏或内存溢出的问题。

例如,以下代码使用 setCompoundDrawablesWithIntrinsicBounds() 方法设置图标:

TextView textView = findViewById(R.id.text_view);
Drawable drawable = getResources().getDrawable(R.drawable.icon);
textView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null);

这段代码不会导致 Native 层内存的增长。

需要注意的是,在使用 setCompoundDrawables()setCompoundDrawablesWithIntrinsicBounds() 方法时,应该尽量避免使用大型的图标,否则仍然会导致 Native 层内存增长。


http://www.ppmy.cn/news/341354.html

相关文章

程序设计语言是什么

对于一个程序设计语言实际上是什么&#xff0c;它被认定的主要用途是什么都不存在某种一致的意见。程序设计语言是一种指挥机器的工具&#xff1f;一种程序员之间交流的方式&#xff1f;一种表述高层设计的媒介&#xff1f;一种算法的记号&#xff1f;一种表述观念间关系的方式…

程序设计语言概述

程序设计语言概述 1、程序设计语言基本概念1.1 程序设计语言类别1.2语言处理程序 2、程序设计语言基本组成(数据、运算、控制、传输) 1、程序设计语言基本概念 1.1 程序设计语言类别 程序设计语言分为机器语言、汇编语言、高级语言。通常人们将机器语言与汇编语言统称为低级语…

计算机程序设计语言

高级语言、汇编语言和机器语言都是用于编写计算机程序的语言。 一.计算机低级语言 计算机低级语言也称为面向机器的语言&#xff0c;使用计算机低级语言编写的程序移植性较差。主要包括机器语言和汇编语言。 &#xff08;1&#xff09;机器语言是由二进制代码0和1组成的若干个…

计算机程序与程序语言

一.计算机程序 计算机程序也叫软件&#xff0c;它告诉计算机该做什么&#xff0c;计算机执行的任何操作&#xff08;从启动到关机&#xff09;都是由程序控制的。程序由一些列命令组成&#xff0c;程序运行时&#xff0c;计算机按特定顺序执行这些命令。 二.编程语言发展历程…

【C】程序设计语言

C语言类型 持续更新2022/10/5 基本类型格式指定符 基本类型 char 字符(一个字节) int 整型 float 浮点型 double 双精度浮点型short long用于限定整形 提供满足不同需求的整数长度 int机器自然长度 short 16位长度 long 32位长度 限定符 short 短整型 限定符 long …

C语言程序设计(一)计算机思维导论

**温馨提示&#xff1a;**所有的笔记&#xff08;需要使用Typora软件打开&#xff09;在视频下方简介中直接获取&#xff0c;纯个人录制&#xff0c;不用加什么公众号这些&#xff0c;各位小伙伴直接网盘自取吧。 计算机思维导论 计算机自1946年问世以来&#xff0c;几乎改变…

计算机经典书籍之程序设计语言

【Java】 Java编程规范&#xff08;第三版)---Java四大名著----JamesGosling(Java之父) 【原 书 名】 The Java Language Specification (3rd Edition) 【原出版社】 Addison-Wesley 【作  者】&#xff08;美&#xff09;James Gosling,Bill Joy,Guy Steele,Gilad Bracha…

C程序设计语言:计算机和编程语言

1.1.1 计算机和编程语言&#xff1a;计算机与编程语言 算法 我们要让计算机做计算&#xff0c;就需要找出计算的步骤&#xff0c;然后用编程语言写出来计算机做的所有的事情都叫做计算计算的步骤就是算法 1.1.2 计算机和编程语言&#xff1a;计算机的思维方式 程序的执行 解…