0

我有一个活动和 4 个选项卡活动。在每个选项卡活动中,我都有画廊、网格布局,当我从选项卡活动返回到我的主要活动时,我得到了 outofMemory 异常。在我的所有选项卡活动中,我有很多图像。我从 5 天开始罢工。请帮助我。我的 logcat 是:

07-30 17:28:42.375: I/dalvikvm-heap(18784): Forcing collection of SoftReferences for 16384016-byte allocation
07-30 17:28:42.406: D/dalvikvm(18784): GC_BEFORE_OOM freed 1K, 34% free 40614K/61511K, paused 29ms, total 30ms
07-30 17:28:42.406: 
E/dalvikvm-heap(18784): Out of memory on a 16384016-byte allocation.
07-30 17:28:42.406: I/dalvikvm(18784): "main" prio=5 tid=1 RUNNABLE
07-30 17:28:42.406: I/dalvikvm(18784): 
  | group="main" sCount=0 dsCount=0 obj=0x41f726a0 self=0x41f5f018
07-30 17:28:42.406: I/dalvikvm(18784): 
  | sysTid=18784 nice=0 sched=0/0 cgrp=apps handle=1075198032
07-30 17:28:42.406: I/dalvikvm(18784):  
 | schedstat=( 0 0 0 ) utm=219 stm=55 core=0
07-30 17:28:42.406: I/dalvikvm(18784): 
  at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
07-30 17:28:42.406: I/dalvikvm(18784):   
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:592)
07-30 17:28:42.406: I/dalvikvm(18784):
   at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:445)
07-30 17:28:42.406: I/dalvikvm(18784): 
  at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:781)
07-30 17:28:42.406:
 I/dalvikvm(18784):   at android.content.res.Resources.loadDrawable(Resources.java:1963)
07-30 17:28:42.406: 
I/dalvikvm(18784):   at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
07-30 17:28:42.406: I/dalvikvm(18784):   at android.view.View.<init>(View.java:3419)
07-30 17:28:42.406: I/dalvikvm(18784):   at android.view.View.<init>(View.java:3352)
07-30 17:28:42.406: I/dalvikvm(18784):   at android.view.ViewGroup.<init>(ViewGroup.java:426)
07-30 17:28:42.406: I/dalvikvm(18784):   at android.widget.RelativeLayout.<init>(RelativeLayout.java:184)
07-30 17:28:42.406: I/dalvikvm(18784):   at java.lang.reflect.Constructor.constructNative(Native Method)
07-30 17:28:42.406: I/dalvikvm(18784):   at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
07-30 17:28:42.406: I/dalvikvm(18784):   at android.view.LayoutInflater.createView(LayoutInflater.java:587)
07-30 17:28:42.406: I/dalvikvm(18784):   at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
07-30 17:28:42.406: I/dalvikvm(18784):   at android.view.LayoutInflater.onCreateView(LayoutInflater.java:660)
07-30 17:28:42.406: I/dalvikvm(18784):   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:685)
07-30 17:28:42.416: I/dalvikvm(18784):   at android.view.LayoutInflater.inflate(LayoutInflater.java:466)
07-30 17:28:42.416: I/dalvikvm(18784):   at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
07-30 17:28:42.416: I/dalvikvm(18784):   at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
07-30 17:28:42.416: I/dalvikvm(18784):   at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:306)
07-30 17:28:42.416: I/dalvikvm(18784):   at android.app.Activity.setContentView(Activity.java:1901)
07-30 17:28:42.416: I/dalvikvm(18784):   at com.inventit.commentu.CommentU_Activity.onCreate(CommentU_Activity.java:182)
07-30 17:28:42.416: I/dalvikvm(18784):   at android.app.Activity.performCreate(Activity.java:5048)
07-30 17:28:42.416: I/dalvikvm(18784):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
07-30 17:28:42.416: I/dalvikvm(18784):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2052)
07-30 17:28:42.416: I/dalvikvm(18784):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2113)
07-30 17:28:42.416: I/dalvikvm(18784):   at android.app.ActivityThread.access$700(ActivityThread.java:139)
07-30 17:28:42.416: I/dalvikvm(18784):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1224)
07-30 17:28:42.416: I/dalvikvm(18784):   at android.os.Handler.dispatchMessage(Handler.java:99)
07-30 17:28:42.416: I/dalvikvm(18784):   at android.os.Looper.loop(Looper.java:137)
07-30 17:28:42.416: I/dalvikvm(18784):   at android.app.ActivityThread.main(ActivityThread.java:4918)
07-30 17:28:42.416: I/dalvikvm(18784):   at java.lang.reflect.Method.invokeNative(Native Method)
07-30 17:28:42.416: I/dalvikvm(18784):   at java.lang.reflect.Method.invoke(Method.java:511)
07-30 17:28:42.416: I/dalvikvm(18784):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004)
07-30 17:28:42.416: I/dalvikvm(18784):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771)
07-30 17:28:42.416: I/dalvikvm(18784):   at dalvik.system.NativeStart.main(Native Method)
07-30 17:28:42.416: A/libc(18784): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 18784 (ventit.commentu)
07-30 17:28:42.416: A/libc(18784): Fatal signal 11 (SIGSEGV) at 0x007d0000 (code=1), thread 18799 (ventit.commentu)
07-30 17:28:50.154: E/Trace(18971): error opening trace file: No such file or directory (2)
07-30 17:28:50.154: D/ActivityThread(18971): setTargetHeapUtilization:0.25
07-30 17:28:50.154: D/ActivityThread(18971): setTargetHeapIdealFree:8388608
07-30 17:28:50.154: D/ActivityThread(18971): setTargetHeapConcurrentStart:2097152
07-30 17:28:50.294: D/dalvikvm(18971): GC_FOR_ALLOC freed 76K, 23% free 16129K/20931K, paused 16ms, total 17ms
07-30 17:28:50.334: I/dalvikvm-heap(18971): Grow heap (frag case) to 40.043MB for 16384016-byte allocation

提前致谢。

4

1 回答 1

0

查看开发人员网站上的管理位图内存文章。

对于 API<=10:

在 Android 2.3.3(API 级别 10)及更低版本上,建议使用 recycle()。如果您在应用程序中显示大量位图数据,您可能会遇到 OutOfMemoryError 错误。recycle()方法允许应用程序尽快回收内存。

注意:只有在确定不再使用位图时才应使用 recycle()。如果您调用 recycle() 并稍后尝试绘制位图,您将收到错误:“画布:尝试使用回收的位图”。

以下代码片段给出了调用 recycle() 的示例。它使用引用计数(在变量 mDisplayRefCount 和 mCacheRefCount 中)来跟踪位图当前是显示还是在缓存中。当满足这些条件时,代码会回收位图:

  • mDisplayRefCount 和 mCacheRefCount 的引用计数均为 0。
  • 位图不为空,还没有被回收。

对于 API>=11:

Android 3.0(API 级别 11)引入了BitmapFactory.Options.inBitmap字段。如果设置了此选项,则采用 Options 对象的解码方法将在加载内容时尝试重用现有位图。这意味着位图的内存被重用,从而提高了性能,并消除了内存分配和取消分配。

于 2013-07-30T12:22:45.643 回答