Android的OOM位图与图像捕获
我一直在这个“内存泄漏”过去3天不间断,而我简化了我的应用程序的其他部分,这个问题一直存在。Android的OOM位图与图像捕获
首先我正在尝试做什么。我正在用EXTRA_OUTPUT激发IMAGE_CAPTURE的意图以将图像保存到文件中。然后,我显示缩小了2倍的返回图像,供用户选择图像的正方形部分。一旦他选择了它,他就会被带到另一个活动,让他用一些文本等标记图像,并最终使用HTTPPost将所有内容上传到服务器。
现在,一切正常工作一次!我可以通过它,一切正常,没有任何问题。如果我尝试拍摄另一张照片,我总是会遇到内存不足异常。这里是logcat的为它的发生
02-18 19:07:19.498: ERROR/dalvikvm-heap(6385): 1040400-byte external allocation too large for this process.
02-18 19:07:19.498: ERROR/GraphicsJNI(6385): VM won't let us allocate 1040400 bytes
02-18 19:07:19.498: DEBUG/AndroidRuntime(6385): Shutting down VM
02-18 19:07:19.498: WARN/dalvikvm(6385): threadid=1: thread exiting with uncaught exception (group=0x4001d7f0)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): FATAL EXCEPTION: main
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.hitpost/com.hitpost.SharePicture}: android.view.InflateException: Binary XML file line #29: Error inflating class <unknown>
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.os.Handler.dispatchMessage(Handler.java:99)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.os.Looper.loop(Looper.java:123)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.app.ActivityThread.main(ActivityThread.java:4627)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at java.lang.reflect.Method.invokeNative(Native Method)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at java.lang.reflect.Method.invoke(Method.java:521)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at dalvik.system.NativeStart.main(Native Method)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): Caused by: android.view.InflateException: Binary XML file line #29: Error inflating class <unknown>
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.view.LayoutInflater.createView(LayoutInflater.java:513)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.view.LayoutInflater.rInflate(LayoutInflater.java:618)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.view.LayoutInflater.rInflate(LayoutInflater.java:621)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.view.LayoutInflater.inflate(LayoutInflater.java:407)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:198)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.app.Activity.setContentView(Activity.java:1647)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at com.hitpost.SharePicture.onCreate(SharePicture.java:90)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): ... 11 more
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): Caused by: java.lang.reflect.InvocationTargetException
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.widget.ImageView.<init>(ImageView.java:108)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at java.lang.reflect.Constructor.constructNative(Native Method)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at java.lang.reflect.Constructor.newInstance(Constructor.java:446)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.view.LayoutInflater.createView(LayoutInflater.java:500)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): ... 23 more
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.graphics.Bitmap.nativeCreate(Native Method)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.graphics.Bitmap.createBitmap(Bitmap.java:468)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.graphics.Bitmap.createBitmap(Bitmap.java:435)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:340)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:488)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:462)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:323)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.content.res.Resources.loadDrawable(Resources.java:1709)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): at android.widget.ImageView.<init>(ImageView.java:118)
02-18 19:07:19.518: ERROR/AndroidRuntime(6385): ... 27 more
它是失败的最后一项活动的的setContentView,在它显示的画面就会向用户的最晚时间,但不知何故无法再次显示。
我真的很感谢帮助!
更新 我已经在多部电话测试这个问题,而且是唯一的地方似乎是在做,这是Nexus One的升级Froyo用。在三星Captivate 2.1上工作,不会在Moto Milestone 2.1上遇到这个问题。
而且我需要在最后一个500×500的图像,所以我不能超过按比例缩小的2倍。
看到我的回复在BitmapFactory OOM driving me nuts。
您的位图数据位于Native堆中,而不是VM堆。因此显式的虚拟机垃圾收集将不起作用。
本地堆是垃圾收集但不太频繁/积极。我们已经找到了工作的唯一方法是
- 监视本机堆(按照上面的链接),以确保你不打的OOM异常
-
腾出位图时,你不需要他们(这将回收原生堆中的空间)通过做(如您所做)
mBitmap.recycle(); mBitmap = null;
你应该尝试在SoftReference
对象包裹位图对象,以便它能够回收操作系统在内存不足的情况下以及应用程序未在当前活动中使用映像的情况。当你的活动改变时,你也应该考虑放弃图像占用的内存,并且当你重新开始特定图像的活动时,应该重新从文件中重新加载图像。
您可能想要进一步缩小图像。根据纵横比和图像的原始尺寸计算缩放比例。 – Samuh 2011-02-19 04:52:29
Samuh,但是,由于我需要一张500x500的图片上传到服务器,因此我无法缩小比例。我将更新描述与更多细节。 – Leo 2011-02-21 21:32:39