为什么 android 要求为一张小照片分配大量内存?
why android asks for a huge memory allocation for a small photo?
我正在尝试在 android phone 上加载大小为 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: FATAL EXCEPTION: main
Process: com.a3sumatch.multipart, PID: 29240
java.lang.OutOfMemoryError: Failed to allocate a 362797068 byte
allocation with 8388608 free bytes and 254MB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:609)
at
android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
at
android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1080)
at
android.content.res.Resources.loadDrawableForCookie(Resources.java:2761)
at android.content.res.Resources.loadDrawable(Resources.java:2654)
at android.content.res.Resources.getDrawable(Resources.java:833)
at
com.a3sumatch.multipart.MainActivity.onClick(MainActivity.java:40)
at android.view.View.performClick(View.java:5205)
at android.view.View$PerformClick.run(View.java:21176)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:171)
at android.app.ActivityThread.main(ActivityThread.java:5611)
at java.lang.reflect.Method.invoke(Native Method)
at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
I am trying to load a jpeg photo with a size of 965KB on my android phone
那是一张绝对巨大的照片。 JPEG 与 PNG 和 WebP 一样,是一种压缩文件格式。从正确的角度来看,一张 3229x2480 的我的秃头照片在 JPEG 中是 829.3KB。我希望你的每个维度都大一点。该分辨率高于我所知道的任何 Android 设备屏幕的分辨率。
您的 OutOfMemoryError
用于分配 362797068 字节。 Bitmap
是图像的未压缩版本。 362797068 字节相当于大约 9524x9524 方形图像(和 4 bytes/pixel)。
所以,你需要做两件事:
如果您在 res/drawable/
中有此图片,请将其移至 res/drawable-nodpi/
将此图像的分辨率沿每个维度至少降低四倍
我正在尝试在 android phone 上加载大小为 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: FATAL EXCEPTION: main Process: com.a3sumatch.multipart, PID: 29240 java.lang.OutOfMemoryError: Failed to allocate a 362797068 byte allocation with 8388608 free bytes and 254MB until OOM at dalvik.system.VMRuntime.newNonMovableArray(Native Method) at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:609) at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444) at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1080) at android.content.res.Resources.loadDrawableForCookie(Resources.java:2761) at android.content.res.Resources.loadDrawable(Resources.java:2654) at android.content.res.Resources.getDrawable(Resources.java:833) at com.a3sumatch.multipart.MainActivity.onClick(MainActivity.java:40) at android.view.View.performClick(View.java:5205) at android.view.View$PerformClick.run(View.java:21176) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:171) at android.app.ActivityThread.main(ActivityThread.java:5611) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
I am trying to load a jpeg photo with a size of 965KB on my android phone
那是一张绝对巨大的照片。 JPEG 与 PNG 和 WebP 一样,是一种压缩文件格式。从正确的角度来看,一张 3229x2480 的我的秃头照片在 JPEG 中是 829.3KB。我希望你的每个维度都大一点。该分辨率高于我所知道的任何 Android 设备屏幕的分辨率。
您的 OutOfMemoryError
用于分配 362797068 字节。 Bitmap
是图像的未压缩版本。 362797068 字节相当于大约 9524x9524 方形图像(和 4 bytes/pixel)。
所以,你需要做两件事:
如果您在
res/drawable/
中有此图片,请将其移至res/drawable-nodpi/
将此图像的分辨率沿每个维度至少降低四倍