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

在 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 层内存增长。

你可能感兴趣的:(Android,android,性能优化,Textview,内存泄漏,内存溢出)