【问题标题】:Overusing memory of start to the image过度使用图像开始的内存
【发布时间】:2018-08-10 02:27:12
【问题描述】:

我们在 Android Studio 上制作了一个程序,一切都很好,但是,我们开始在特定的测试手机中遇到内存问题,它是 MOTO G4 PLUS,ANDROID 7.0,API 24,当我们开始时,它使用大约 29GB。

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.wende.memeadventures, PID: 16490
                  java.lang.OutOfMemoryError: Failed to allocate a 29160012 byte allocation with 803264 free bytes and 784KB until OOM

但是在其他所有测试手机上,它都运行良好,我们删除了程序中使用的一些图像,问题解决了,但我们需要图像,我们不知道该怎么办,我们尝试压缩图像,但没有成功。

使用的另一部手机是 J2,Android 5.1.1 API 22,它运行良好。这对我来说没有任何意义。

这是我的主要活动布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background"
    tools:context=".Activities.MainActivity">

    <Button
        android:id="@+id/Click_btn"
        android:layout_width="0dp"
        android:layout_height="421dp"
        android:layout_marginBottom="68dp"
        android:layout_marginTop="8dp"
        android:background="@null"
        android:text="@null"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/top_Bar_iv" />

    <ImageView
        android:id="@+id/Bot_Bar_iv"
        android:layout_width="match_parent"
        android:layout_height="164dp"
        android:scaleType="centerCrop"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:srcCompat="@drawable/painel_down" />

    <ImageView
        android:id="@+id/top_Bar_iv"
        android:layout_width="match_parent"
        android:layout_height="70dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@android:color/holo_green_dark" />

    <ImageView
        android:id="@+id/Money_bg_iv"
        android:layout_width="168dp"
        android:layout_height="53dp"
        android:layout_marginBottom="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:scaleType="fitXY"
        app:layout_constraintBottom_toBottomOf="@+id/top_Bar_iv"
        app:layout_constraintStart_toStartOf="@+id/top_Bar_iv"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/moneycash_bg" />

    <ImageView
        android:id="@+id/Cash_bg_iv"
        android:layout_width="113dp"
        android:layout_height="53dp"
        android:layout_marginBottom="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:scaleType="fitXY"
        app:layout_constraintBottom_toBottomOf="@+id/top_Bar_iv"
        app:layout_constraintEnd_toEndOf="@+id/Cash_tv"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toEndOf="@+id/Money_bg_iv"
        app:layout_constraintTop_toTopOf="@+id/top_Bar_iv"
        app:srcCompat="@drawable/moneycash_bg" />

    <TextView
        android:id="@+id/Money_tv"
        android:layout_width="94dp"
        android:layout_height="26dp"
        android:layout_marginBottom="8dp"
        android:layout_marginStart="30dp"
        android:layout_marginTop="9dp"
        android:gravity="center"
        android:text="Dinheiro"
        app:layout_constraintBottom_toBottomOf="@+id/top_Bar_iv"
        app:layout_constraintStart_toStartOf="@+id/top_Bar_iv"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/Cash_tv"
        android:layout_width="68dp"
        android:layout_height="25dp"
        android:layout_marginBottom="8dp"
        android:layout_marginStart="64dp"
        android:layout_marginTop="7dp"
        android:gravity="center"
        android:text="Cash"
        app:layout_constraintBottom_toBottomOf="@+id/top_Bar_iv"
        app:layout_constraintStart_toEndOf="@+id/Money_tv"
        app:layout_constraintTop_toTopOf="@+id/top_Bar_iv"
        app:layout_constraintVertical_bias="0.533" />

    <ImageButton
        android:id="@+id/Cash_btn"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="10dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:background="@null"
        android:onClick="cash_click"
        android:scaleType="centerInside"
        app:layout_constraintBottom_toBottomOf="@+id/top_Bar_iv"
        app:layout_constraintEnd_toEndOf="@+id/Cash_bg_iv"
        app:layout_constraintStart_toEndOf="@+id/Cash_tv"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.56"
        app:srcCompat="@mipmap/ic_launcher_round" />

    <ImageButton
        android:id="@+id/money_btn"
        android:layout_width="33dp"
        android:layout_height="31dp"
        android:layout_marginBottom="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:background="@null"
        android:onClick="money_click"
        android:scaleType="centerInside"
        app:layout_constraintBottom_toBottomOf="@+id/top_Bar_iv"
        app:layout_constraintStart_toEndOf="@+id/Money_tv"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/meme_coin" />

    <ImageButton
        android:id="@+id/Config_btn"
        android:layout_width="45dp"
        android:layout_height="45dp"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="16dp"
        android:layout_marginTop="8dp"
        android:background="@null"
        android:onClick="config_click"
        android:scaleType="centerInside"
        app:layout_constraintBottom_toBottomOf="@+id/top_Bar_iv"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.888"
        app:srcCompat="@drawable/config" />

    <ImageButton
        android:id="@+id/Upgrades_btn"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:background="@null"
        android:onClick="upgrades_click"
        android:scaleType="centerInside"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.33"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/Bot_Bar_iv"
        app:layout_constraintVertical_bias="0.925"
        app:srcCompat="@drawable/botao_upgrade" />

    <ImageButton
        android:id="@+id/Reset_btn"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:background="@null"
        android:onClick="reset_click"
        android:scaleType="centerInside"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/Bot_Bar_iv"
        app:layout_constraintVertical_bias="0.925"
        app:srcCompat="@drawable/botao_reset" />

    <ImageButton
        android:id="@+id/CashStore_btn"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:background="@null"
        android:onClick="cashstore_click"
        android:scaleType="centerInside"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/Bot_Bar_iv"
        app:layout_constraintVertical_bias="0.925"
        app:srcCompat="@drawable/botao_dinheiro" />

    <ImageButton
        android:id="@+id/Quests_btn"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:background="@null"
        android:onClick="quests_click"
        android:scaleType="centerInside"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.67"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/Bot_Bar_iv"
        app:layout_constraintVertical_bias="0.925"
        app:srcCompat="@drawable/botao_missao" />

</android.support.constraint.ConstraintLayout>

对不起。这是我在这里的第一个问题,我的英语可能并不完美。并感谢您提供帮助。

【问题讨论】:

  • 请贴出加载图片的代码和图片目录
  • 图片在这个目录下:app\src\main\res\drawable。我真的不知道这是否正是你所要求的,如果它真的错了,你能更具体一点吗?我们还在学习,很抱歉缺乏经验
  • 你可以试试app:srcCompat,而不是android:src?我知道这听起来很愚蠢,但有时会回到基本工作

标签: java android memory


【解决方案1】:

图片太大,hdpixhdpixxhdpi会加载不同尺寸的图片。你可以通过demo得到尺寸

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
Bitmap.Config preferredConfig = options.inPreferredConfig;
LogUtils.d("size is"+(imageHeight*imageWidth*getBytesPerPixel(preferredConfig)/1024/1024)+"MB");

您应该了解更多关于BitmapFactory.decodeResource,这里是link。你的问题可以从image OOM找到解决方案

【讨论】:

  • 我去看看。非常感谢您的帮助,看来确实是问题所在。但为什么它只发生在那个手机中(具有更高级的 API 和更高的内存)?
  • 它会根据手机的密度从hdpixhdpixxhdpi加载不同尺寸的图片
  • 这肯定会对我有所帮助。非常感谢您的帮助。
【解决方案2】:

在我看来,失败的手机没有足够的内存。

AFAIK 无法使用比图像所需内存更少的内存(一次)处理整个图像。

  • 您可以尝试更改图像分辨率;即减少像素数。
  • 您可以尝试将图像拆分为子图像(图块)并一次处理一个。

压缩不起作用,因为压缩图像必须在内存中解压缩才能对它们进行任何操作;例如显示它们。缩小和平铺需要您在图像到达设备之前进行一些图像处理。

【讨论】:

  • 有问题的手机有 8GB 内存,比另一个运行流畅的手机要多。这仍然是问题吗?我怎么能做你给我的第二个选择? (分割图像)。并感谢遮阳篷。
猜你喜欢
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
相关资源
最近更新 更多