gpt4 book ai didi

android - 在 ImageView 中设置图像时内存不足

转载 作者:行者123 更新时间:2023-11-29 00:06:43 26 4
gpt4 key购买 nike

我在应用程序的 4 个不同位置设置帮助屏幕图像。 Activity 代码如下-

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.help_list);
int screenType = getIntent().getIntExtra("screenName", 0);
ImageView imageView = (ImageView) findViewById(R.id.help_image);

switch (screenType) {
case 1:
imageView.setImageResource(R.drawable.help0);
break;
case 2:
imageView.setImageResource(R.drawable.help1);
break;
case 3:
imageView.setImageResource(R.drawable.help2);
break;
case 4:
imageView.setImageResource(R.drawable.help3);
break;
}

findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});

此代码在大多数设备上都能成功执行,但在某些设备(例如三星)上,应用程序会因内存不足异常而崩溃。

我已经尝试回收位图-

   BitmapDrawable bitmapDrawable = ((BitmapDrawable) imageView.getDrawable());
if (bitmapDrawable != null) {
bitmapDrawable.getBitmap().recycle();
}

但是上面的代码总是在bitmapDrawable的值中给出null。如何修复此 OutOfmemory 异常?

附言可绘制图像的最大尺寸为 80kb

最佳答案

图像的像素大小是多少?由于图像存储在 java 堆中,因此不会压缩它们。这意味着位图的每个像素在堆中最多可以占用 32 位 = 4 个字节。因此,对于尺寸为 1920 x 1080 的图像(也许您还针对大分辨率平板电脑),即:

1920 x 1080 x 4 bytes = 8294400 bytes, 8.29 megabytes.

现在这在平板电脑上可能没问题,但在堆空间可能为 64 MB 的旧手机上,您可能很容易遇到 OutOfMemoryExceptions。

那你能做什么呢?

  1. 如果您只针对手机,是否可以将图片调整为更小的尺寸?这主要基于反复试验,也取决于图像的用途(模糊背景图像 VS 具有重要细节的 map 图像)。

  2. 使用不同的位图配置。默认为RGB_8888,即每个 channel 8位(ARGB)= 32位。如果您不需要 alpha channel (透明度),并且图像不需要超高质量,您应该试试 RGB_565。它的质量下降非常小,但几乎不明显。作为返回,它消耗了一半的内存(每像素 5 + 6 + 5 = 16 位)。

  3. 最重要的修复:您可以为不同的屏幕密度提供不同的图像。所以这是一个例子。假设我们要使用来自计算的全高清图片。对于较小的屏幕,我们将其缩小以节省内存。有针对不同密度缩小图像的工具,请参阅 this question .按照密度准则,您可以将以下具有尺寸的图像放在给定目录中:

    • drawable-xxhdpi: 1920x1080
    • drawable-xhdpi: 1280x720
    • drawable-hdpi: 960x540
    • drawable-mdpi: 640x360

    因此,虽然图像在大型平板电脑上会占用 8.29 Mb 堆空间,但在旧手机上只会占用 921 Kb,这正是我们想要的。不过,它确实会增加 APK 大小,因为现在它包含 4 张图片,而不是一张。

关于android - 在 ImageView 中设置图像时内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33279223/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com