在ImageView中设置图像时OutOfMemory

时间:2015-10-22 10:47:30

标签: android out-of-memory android-bitmap

我正在我的应用中的4个不同位置设置帮助屏幕图像。活动代码如下 -

@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();
            }
        });

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

我试图回收Bitmap -

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

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

P.S。图像绘制的最大尺寸为80kb

2 个答案:

答案 0 :(得分:2)

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

    string query = "Select * FROM Customers INNER JOIN ..."; //you have to pass sql query
    MySqlDataAdapter da = new MySqlDataAdapter();
    da.SelectCommand = query;
    ...

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

那你能做什么?

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

  2. 使用不同的位图配置。默认值为1920 x 1080 x 4 bytes = 8294400 bytes, 8.29 megabytes. ,每个通道为8位(ARGB)= 32位。如果您不需要Alpha通道(透明度),并且图像不一定非常高质量,那么您应该尝试RGB_8888。它的质量下降非常小,但几乎不明显。作为回报,它消耗了一半的内存(5 + 6 + 5 =每像素16位)。

  3. 最重要的修复:您可以为不同的屏幕密度提供不同的图像。所以这是一个例子。让我们说我们想要使用计算中的FullHD图片。 对于较小的屏幕,我们将其缩小,节省内存。有一些工具可以根据不同的密度缩小图像,请参阅this question。 遵循密度指南,您可以将以下图像放在给定目录中:

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

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

答案 1 :(得分:0)

我认为您的问题描述得很好here

或者您可以通过photoshop将图像尺寸更改为50x50等。