android bitmap java.lang.outofmemoryerror,java.lang.OutOfMemoryError: bitmap size exceeds VM budget

09-14 13:11:50.658: E/AndroidRuntime(1235): FATAL EXCEPTION: main

09-14 13:11:50.658: E/AndroidRuntime(1235): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ceosoftcenters.marshall.alumnilife/com.ceosoftcenters.marshall.alumnilife.activity.PuzzleActivity}: android.view.InflateException: Binary XML file line #40: Error inflating class

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1655)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1671)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.app.ActivityThread.access$1500(ActivityThread.java:117)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.os.Handler.dispatchMessage(Handler.java:99)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.os.Looper.loop(Looper.java:130)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.app.ActivityThread.main(ActivityThread.java:3694)

09-14 13:11:50.658: E/AndroidRuntime(1235): at java.lang.reflect.Method.invokeNative(Native Method)

09-14 13:11:50.658: E/AndroidRuntime(1235): at java.lang.reflect.Method.invoke(Method.java:507)

09-14 13:11:50.658: E/AndroidRuntime(1235): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)

09-14 13:11:50.658: E/AndroidRuntime(1235): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)

09-14 13:11:50.658: E/AndroidRuntime(1235): at dalvik.system.NativeStart.main(Native Method)

09-14 13:11:50.658: E/AndroidRuntime(1235): Caused by: android.view.InflateException: Binary XML file line #40: Error inflating class

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.view.LayoutInflater.createView(LayoutInflater.java:518)

09-14 13:11:50.658: E/AndroidRuntime(1235): at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:568)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.view.LayoutInflater.rInflate(LayoutInflater.java:623)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.view.LayoutInflater.rInflate(LayoutInflater.java:626)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.view.LayoutInflater.inflate(LayoutInflater.java:408)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.view.LayoutInflater.inflate(LayoutInflater.java:320)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.view.LayoutInflater.inflate(LayoutInflater.java:276)

09-14 13:11:50.658: E/AndroidRuntime(1235): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:206)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.app.Activity.setContentView(Activity.java:1681)

09-14 13:11:50.658: E/AndroidRuntime(1235): at com.ceosoftcenters.marshall.alumnilife.activity.PuzzleActivity.onCreate(PuzzleActivity.java:62)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1619)

09-14 13:11:50.658: E/AndroidRuntime(1235): ... 11 more

09-14 13:11:50.658: E/AndroidRuntime(1235): Caused by: java.lang.reflect.InvocationTargetException

09-14 13:11:50.658: E/AndroidRuntime(1235): at java.lang.reflect.Constructor.constructNative(Native Method)

09-14 13:11:50.658: E/AndroidRuntime(1235): at java.lang.reflect.Constructor.newInstance(Constructor.java:415)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.view.LayoutInflater.createView(LayoutInflater.java:505)

09-14 13:11:50.658: E/AndroidRuntime(1235): ... 23 more

09-14 13:11:50.658: E/AndroidRuntime(1235): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.graphics.Bitmap.nativeCreate(Native Method)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.graphics.Bitmap.createBitmap(Bitmap.java:477)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.graphics.Bitmap.createBitmap(Bitmap.java:444)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:349)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:512)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:487)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.content.res.Resources.loadDrawable(Resources.java:1739)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.content.res.TypedArray.getDrawable(TypedArray.java:601)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.view.View.(View.java:1952)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.view.View.(View.java:1900)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.view.ViewGroup.(ViewGroup.java:292)

09-14 13:11:50.658: E/AndroidRuntime(1235): at android.widget.RelativeLayout.(RelativeLayout.java:173)

09-14 13:11:50.658: E/AndroidRuntime(1235): ... 26 more

RelativeLayout pRelativeLayout = (RelativeLayout)this.findViewById(R.id.pRelativeLayout);

pRelativeLayout.setBackgroundDrawable(newBitmapDrawable(ReadBitmapUtil.readBitMap(this, R.drawable.p)));

Android开发中,`java.lang.IllegalStateException: Cannot obtain size for recycled Bitmap` 是一个常见的异常,它通常发生在尝试访问一个已经被回收(recycled)的 `Bitmap` 对象的尺寸信息时。`Bitmap` 被回收后,其内部的像素数据会被释放,因此无法再获取其宽度、高度等信息[^1]。 ### 异常原因分析 1. **Bitmap 已被回收** 当调用 `bitmap.recycle()` 后,该 `Bitmap` 对象将不再持有其像素数据,任何试图访问其尺寸(如调用 `getWidth()` 或 `getHeight()`)的操作都会抛出 `IllegalStateException`。 2. **资源复用不当** 在使用 `BitmapFactory.decodeXXX` 或 `Bitmap.createBitmap()` 等方法时,若复用了已经被回收的 `Bitmap` 实例,也可能导致此异常。 3. **异步加载与释放冲突** 在异步加载图片并显示的过程中,若加载未完成前就调用了 `recycle()`,或在加载完成后继续使用已被回收的 `Bitmap`,也会触发该异常。 --- ### 解决方案 #### 1. 确保在访问前 Bitmap 未被回收 在访问 `Bitmap` 的尺寸信息之前,应检查其是否已经被回收: ```java if (bitmap != null && !bitmap.isRecycled()) { int width = bitmap.getWidth(); int height = bitmap.getHeight(); // 继续操作 } ``` #### 2. 避免提前回收 Bitmap 确保在所有使用 `Bitmap` 的逻辑完成之后再调用 `recycle()`,尤其是在多线程环境中。例如,在图片加载完成后,确保 UI 线程已显示完毕再进行回收操作。 #### 3. 使用弱引用管理 Bitmap 使用 `WeakReference<Bitmap>` 来避免强引用导致的内存泄漏问题,同时可以配合 `ReferenceQueue` 来监听 `Bitmap` 是否被回收: ```java WeakReference<Bitmap> bitmapRef = new WeakReference<>(bitmap); Bitmap currentBitmap = bitmapRef.get(); if (currentBitmap != null && !currentBitmap.isRecycled()) { // 安全使用 } ``` #### 4. 使用 BitmapFactory.Options 获取图片尺寸而不加载到内存 如果只是需要获取图片尺寸而不实际加载到内存中,可以使用 `BitmapFactory.Options` 的 `inJustDecodeBounds` 属性: ```java BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(filePath, options); int width = options.outWidth; int height = options.outHeight; ``` 这样可以避免加载整个图片到内存中,同时获取其尺寸信息。 --- ### 最佳实践建议 - **避免重复回收**:确保 `recycle()` 只被调用一次,避免重复调用导致不可预料的行为。 - **使用内存缓存**:使用如 `LruCache` 缓存常用 `Bitmap`,减少频繁创建和回收带来的性能损耗。 - **异步加载注意生命周期管理**:在 `Activity` 或 `Fragment` 销毁时,取消未完成的异步加载任务,避免在无效上下文中操作 `Bitmap`。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值