【问题标题】:why android asks for a huge memory allocation for a small photo?为什么android要求为一张小照片分配大量内存?
【发布时间】:2018-02-07 00:53:33
【问题描述】:

我正在尝试在我的安卓手机上加载一张大小为 965KB 的 jpeg 照片。代码如下。当我运行代码时,应用程序崩溃了。

Button _btn = (Button) findViewById(R.id.btn1);
_btn.setOnClickListener(new View.OnClickListener() {

     @Override
      public void onClick(View view) {
           Drawable _draw  = getResources().getDrawable(R.drawable.sea, null);
    }
});

这是崩溃日志。

E/AndroidRuntime: 致命异常: main 进程:com.a3sumatch.multipart,PID:29240 java.lang.OutOfMemoryError:分配 362797068 字节失败 分配 8388608 个可用字节和 254MB 直到 OOM 在 dalvik.system.VMRuntime.newNonMovableArray(本机方法) 在 android.graphics.BitmapFactory.nativeDecodeAsset(本机方法) 在 android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:609) 在 android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444) 在 android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1080) 在 android.content.res.Resources.loadDrawableForCookie(Resources.java:2761) 在 android.content.res.Resources.loadDrawable(Resources.java:2654) 在 android.content.res.Resources.getDrawable(Resources.java:833) 在 com.a3sumatch.multipart.MainActivity$1.onClick(MainActivity.java:40) 在 android.view.View.performClick(View.java:5205) 在 android.view.View$PerformClick.run(View.java:21176) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:171) 在 android.app.ActivityThread.main(ActivityThread.java:5611) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)

【问题讨论】:

标签: android crash out-of-memory


【解决方案1】:

我正在尝试在我的安卓手机上加载一张大小为 965KB 的 jpeg 照片

那是一张绝对巨大的照片。 JPEG 与 PNG 和 WebP 一样,是一种压缩文件格式。换个角度来看,我秃头的 3229x2480 照片在 JPEG 中是 829.3KB。我希望你的每个维度都大一点。该分辨率高于我所知道的任何 Android 设备屏幕的分辨率。

您的 OutOfMemoryError 用于分配 362797068 字节。 Bitmap 是图像的未压缩版本。 362797068 字节相当于大约 9524x9524 的正方形图像(和 4 字节/像素)。

所以,你需要做两件事:

  1. 如果您在res/drawable/ 中有此图片,请将其移至res/drawable-nodpi/

  2. 沿每个维度将此图像的分辨率至少降低四倍

【讨论】:

  • 对不起,我还是不明白。为什么android会尝试为不超过1M的照片分配大约345M的内存?
  • @StoneLai:首先,引用我的回答,“JPEG 与 PNG 和 WebP 一样,是一种压缩文件格式……Bitmap 是图像的未压缩版本。”压缩文件很容易只有未压缩数据大小的 1-10%。其次,如果您将图像放入res/drawable/,正如我所怀疑的那样,您就是在告诉 Android 您为-mdpi 显示器设计了图像,并且 Android 应该为更高密度的屏幕放大图像。
猜你喜欢
  • 2021-04-01
  • 2018-10-08
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-07
  • 2021-10-25
相关资源
最近更新 更多