gpt4 book ai didi

java - 图片太大 : OutOfMemory Exception

转载 作者:行者123 更新时间:2023-12-01 13:38:32 25 4
gpt4 key购买 nike

我的背景图像太大,因此应用程序崩溃并出现以下错误(我也从 LogCat 复制其他有用的消息)

01-10 14:53:48.799: E/dalvikvm-heap(9297): Out of memory on a 6955024-byte allocation.
01-10 14:53:48.799: I/dalvikvm(9297): "main" prio=5 tid=1 RUNNABLE
01-10 14:53:48.799: I/dalvikvm(9297): | group="main" sCount=0 dsCount=0 obj=0x40a729a0 self=0x2a00bba8
01-10 14:53:48.799: I/dalvikvm(9297): | sysTid=9297 nice=0 sched=0/0 cgrp=apps handle=1073849308
01-10 14:53:48.812: I/dalvikvm(9297): | state=R schedstat=( 38497557466 45560972992 4658 ) utm=3335 stm=514 core=0
01-10 14:53:48.840: I/dalvikvm(9297): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
01-10 14:53:48.840: I/dalvikvm(9297): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:502)
01-10 14:53:48.840: I/dalvikvm(9297): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:355)
01-10 14:53:48.840: I/dalvikvm(9297): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:785)
01-10 14:53:48.840: I/dalvikvm(9297): at android.content.res.Resources.loadDrawable(Resources.java:1965)
01-10 14:53:48.840: I/dalvikvm(9297): at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
01-10 14:53:48.840: I/dalvikvm(9297): at android.view.View.<init>(View.java:3330)
01-10 14:53:48.860: I/dalvikvm(9297): at android.view.View.<init>(View.java:3259)
01-10 14:53:48.860: I/dalvikvm(9297): at android.view.ViewGroup.<init>(ViewGroup.java:425)
01-10 14:53:48.860: I/dalvikvm(9297): at android.widget.RelativeLayout.<init>(RelativeLayout.java:210)
01-10 14:53:48.860: I/dalvikvm(9297): at java.lang.reflect.Constructor.constructNative(Native Method)
01-10 14:53:48.860: I/dalvikvm(9297): at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
01-10 14:53:48.860: I/dalvikvm(9297): at android.view.LayoutInflater.createView(LayoutInflater.java:587)
01-10 14:53:48.860: I/dalvikvm(9297): at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
01-10 14:53:48.860: I/dalvikvm(9297): at android.view.LayoutInflater.onCreateView(LayoutInflater.java:660)
01-10 14:53:48.860: I/dalvikvm(9297): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:685)
01-10 14:53:48.860: I/dalvikvm(9297): at android.view.LayoutInflater.inflate(LayoutInflater.java:466)
01-10 14:53:48.860: I/dalvikvm(9297): at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
01-10 14:53:48.860: I/dalvikvm(9297): at com.xxx.xxx.InputFragment.onCreateView(InputFragment.java:70)
01-10 14:53:48.860: I/dalvikvm(9297): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1478)
01-10 14:53:48.860: I/dalvikvm(9297): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)
01-10 14:53:48.860: I/dalvikvm(9297): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
01-10 14:53:48.860: I/dalvikvm(9297): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086)
01-10 14:53:48.860: I/dalvikvm(9297): at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1877)
01-10 14:53:48.860: I/dalvikvm(9297): at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:552)
01-10 14:53:48.860: I/dalvikvm(9297): at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1164)
01-10 14:53:48.860: I/dalvikvm(9297): at android.app.Activity.performStart(Activity.java:5114)
01-10 14:53:48.860: I/dalvikvm(9297): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2153)
01-10 14:53:48.860: I/dalvikvm(9297): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
01-10 14:53:48.860: I/dalvikvm(9297): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3692)
01-10 14:53:48.860: I/dalvikvm(9297): at android.app.ActivityThread.access$700(ActivityThread.java:141)
01-10 14:53:48.860: I/dalvikvm(9297): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1240)
01-10 14:53:48.910: I/dalvikvm(9297): at android.os.Handler.dispatchMessage(Handler.java:99)
01-10 14:53:48.910: I/dalvikvm(9297): at android.os.Looper.loop(Looper.java:137)
01-10 14:53:48.920: I/dalvikvm(9297): at android.app.ActivityThread.main(ActivityThread.java:5041)
01-10 14:53:48.920: I/dalvikvm(9297): at java.lang.reflect.Method.invokeNative(Native Method)
01-10 14:53:48.920: I/dalvikvm(9297): at java.lang.reflect.Method.invoke(Method.java:511)
01-10 14:53:48.920: I/dalvikvm(9297): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-10 14:53:48.920: I/dalvikvm(9297): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-10 14:53:48.920: I/dalvikvm(9297): at dalvik.system.NativeStart.main(Native Method)
01-10 14:53:49.315: D/skia(9297): --- decoder->decode returned false
01-10 14:53:49.315: D/AndroidRuntime(9297): Shutting down VM
01-10 14:53:49.320: W/dalvikvm(9297): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
01-10 14:53:49.570: E/AndroidRuntime(9297): FATAL EXCEPTION: main
01-10 14:53:49.570: E/AndroidRuntime(9297): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xxx.xxx/com.xxx.xxx.MainActivity}: android.view.InflateException: Binary XML file line #1: Error inflating class <unknown>
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3692)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.app.ActivityThread.access$700(ActivityThread.java:141)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1240)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.os.Handler.dispatchMessage(Handler.java:99)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.os.Looper.loop(Looper.java:137)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.app.ActivityThread.main(ActivityThread.java:5041)
01-10 14:53:49.570: E/AndroidRuntime(9297): at java.lang.reflect.Method.invokeNative(Native Method)
01-10 14:53:49.570: E/AndroidRuntime(9297): at java.lang.reflect.Method.invoke(Method.java:511)
01-10 14:53:49.570: E/AndroidRuntime(9297): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-10 14:53:49.570: E/AndroidRuntime(9297): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-10 14:53:49.570: E/AndroidRuntime(9297): at dalvik.system.NativeStart.main(Native Method)
01-10 14:53:49.570: E/AndroidRuntime(9297): Caused by: android.view.InflateException: Binary XML file line #1: Error inflating class <unknown>
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.view.LayoutInflater.createView(LayoutInflater.java:613)
01-10 14:53:49.570: E/AndroidRuntime(9297): at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.view.LayoutInflater.onCreateView(LayoutInflater.java:660)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:685)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.view.LayoutInflater.inflate(LayoutInflater.java:466)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
01-10 14:53:49.570: E/AndroidRuntime(9297): at com.xxx.xxx.InputFragment.onCreateView(InputFragment.java:70)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1478)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1877)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:552)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1164)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.app.Activity.performStart(Activity.java:5114)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2153)
01-10 14:53:49.570: E/AndroidRuntime(9297): ... 12 more
01-10 14:53:49.570: E/AndroidRuntime(9297): Caused by: java.lang.reflect.InvocationTargetException
01-10 14:53:49.570: E/AndroidRuntime(9297): at java.lang.reflect.Constructor.constructNative(Native Method)
01-10 14:53:49.570: E/AndroidRuntime(9297): at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.view.LayoutInflater.createView(LayoutInflater.java:587)
01-10 14:53:49.570: E/AndroidRuntime(9297): ... 27 more
01-10 14:53:49.570: E/AndroidRuntime(9297): Caused by: java.lang.OutOfMemoryError
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:502)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:355)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:785)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.content.res.Resources.loadDrawable(Resources.java:1965)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.view.View.<init>(View.java:3330)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.view.View.<init>(View.java:3259)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.view.ViewGroup.<init>(ViewGroup.java:425)
01-10 14:53:49.570: E/AndroidRuntime(9297): at android.widget.RelativeLayout.<init>(RelativeLayout.java:210)
01-10 14:53:49.570: E/AndroidRuntime(9297): ... 30 more

我的背景图像位于 Drawable 文件夹中。是的,我的意思是“文件夹”,因为该应用程序旨在支持多个屏幕,并且图像位于所有文件夹中,尺寸略有变化。

如何才能毫无问题地加载这么大的位图?我执行了以下代码。

public static Bitmap getResizedBitmap(Bitmap image, int newHeight, int newWidth) {
int width = image.getWidth();
int height = image.getHeight();
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// create a matrix for the manipulation
Matrix matrix = new Matrix();
// resize the bit map
matrix.postScale(scaleWidth, scaleHeight);
// recreate the new Bitmap
Bitmap resizedBitmap = Bitmap.createBitmap(image, 0, 0, width, height,
matrix, false);
return resizedBitmap;
}

但实际情况是,这段代码是手动设置宽度和高度的,对吗?但我要应用此图像作为背景图像,所以我不知道这是否是最好的方法,并且我不确定要插入什么值作为宽度和高度。我所知道的是我需要在 onCreateView() 方法中设置图像(我正在使用 fragment )。

最佳答案

在加载图像之前使用 BitmapFactory.Options 获取图像的大小,然后您可以根据需要将背景缩小到较低分辨率的图像,该图像仍然适合背景但不会引发 OOM 错误。此外,您还可以将 DisplayMetrics 用于您所需的宽度和高度,或者您要设置背景的 View 的宽度和高度。

来自 Android 培训文档 ( http://developer.android.com/training/displaying-bitmaps/load-bitmap.html ):

The BitmapFactory class provides several decoding methods (decodeByteArray(), decodeFile(), decodeResource(), etc.) for creating a Bitmap from various sources. Choose the most appropriate decode method based on your image data source. These methods attempt to allocate memory for the constructed bitmap and therefore can easily result in an OutOfMemory exception. Each type of decode method has additional signatures that let you specify decoding options via the BitmapFactory.Options class. Setting the inJustDecodeBounds property to true while decoding avoids memory allocation, returning null for the bitmap object but setting outWidth, outHeight and outMimeType. This technique allows you to read the dimensions and type of the image data prior to construction (and memory allocation) of the bitmap.

 BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
String imageType = options.outMimeType;

To avoid java.lang.OutOfMemory exceptions, check the dimensions of a bitmap before decoding it, unless you absolutely trust the source to provide you with predictably sized image data that comfortably fits within the available memory.

关于java - 图片太大 : OutOfMemory Exception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21047721/

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