【发布时间】:2013-09-06 17:15:03
【问题描述】:
我正在尝试将自定义视图多次从 xml 添加到 android 活动中的另一个视图。但是在打开和关闭该活动几次后会导致内存不足错误。代码如下:
ImageLoader imageLoader = new ImageLoader(currentActivity.getApplicationContext());
FlowLayout postsLayout = (FlowLayout) findViewById(R.id.tab_posts);
postsLayout.removeAllViews();
for (final Post post : postsData) {
RelativeLayout profilePostItem = (RelativeLayout) View.inflate(this, R.layout.drawer_item, null);
ImageView postPic = (ImageView) profilePostItem.findViewById(R.id.post_pic);
String picUrl = post.getSingleImageURL();
if(picUrl != null && !picUrl.equals("null"))
{
postPic.setTag(picUrl);
imageLoader.DisplayImage(picUrl, currentActivity, postPic, R.drawable.default_item);
}
profilePostItem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(currentActivity, PostDetailsActivity.class);
intent.putExtra("postID", Integer.toString(post.getPostId()));
currentActivity.startActivity(intent);
}
});
postsLayout.addView(profilePostItem);
}
这里是drawer_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<ImageView
android:id="@+id/post_pic"
android:layout_width="140dp"
android:layout_height="140dp"
android:background="#FFFFFF"
android:src="@drawable/default_user_pic"
/>
</RelativeLayout>
这是 LogCat 的输出:
09-06 22:32:45.566: D/dalvikvm(11857): GC_BEFORE_OOM freed <1K, 6% free 46549K/49095K, paused 67ms, total 67ms
09-06 22:32:45.566: E/dalvikvm-heap(11857): Out of memory on a 67816-byte allocation.
09-06 22:32:45.566: I/dalvikvm(11857): "Thread-15875" prio=4 tid=53 RUNNABLE
09-06 22:32:45.566: I/dalvikvm(11857): | group="main" sCount=0 dsCount=0 obj=0x4325e6d8 self=0x53269790
09-06 22:32:45.566: I/dalvikvm(11857): | sysTid=12239 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=1395039200
09-06 22:32:45.566: I/dalvikvm(11857): | schedstat=( 124808833 28013003 46 ) utm=10 stm=1 core=1
09-06 22:32:45.566: I/dalvikvm(11857): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
09-06 22:32:45.566: I/dalvikvm(11857): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:652)
09-06 22:32:45.566: I/dalvikvm(11857): at com.company.testapp.utils.ImageLoader.decodeFile(ImageLoader.java:139)
09-06 22:32:45.566: I/dalvikvm(11857): at com.company.testapp.utils.ImageLoader.getBitmap(ImageLoader.java:81)
09-06 22:32:45.566: I/dalvikvm(11857): at com.company.testapp.utils.ImageLoader.access$0(ImageLoader.java:73)
09-06 22:32:45.566: I/dalvikvm(11857): at com.company.testapp.utils.ImageLoader$PhotosLoader.run(ImageLoader.java:196)
09-06 22:32:45.566: D/skia(11857): --- decoder->decode returned false
09-06 22:32:45.566: W/dalvikvm(11857): threadid=53: thread exiting with uncaught exception (group=0x41aee2a0)
09-06 22:32:45.566: E/AndroidRuntime(11857): FATAL EXCEPTION: Thread-15875
09-06 22:32:45.566: E/AndroidRuntime(11857): java.lang.OutOfMemoryError
09-06 22:32:45.566: E/AndroidRuntime(11857): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
09-06 22:32:45.566: E/AndroidRuntime(11857): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:652)
09-06 22:32:45.566: E/AndroidRuntime(11857): at com.company.testapp.utils.ImageLoader.decodeFile(ImageLoader.java:139)
09-06 22:32:45.566: E/AndroidRuntime(11857): at com.company.testapp.utils.ImageLoader.getBitmap(ImageLoader.java:81)
09-06 22:32:45.566: E/AndroidRuntime(11857): at com.company.testapp.utils.ImageLoader.access$0(ImageLoader.java:73)
09-06 22:32:45.566: E/AndroidRuntime(11857): at com.company.testapp.utils.ImageLoader$PhotosLoader.run(ImageLoader.java:196)
09-06 22:32:45.651: I/dalvikvm-heap(11857): Clamp target GC heap from 48.757MB to 48.000MB
09-06 22:32:45.651: D/dalvikvm(11857): GC_FOR_ALLOC freed 180K, 6% free 46583K/49159K, paused 68ms, total 68ms
09-06 22:32:45.651: I/dalvikvm-heap(11857): Forcing collection of SoftReferences for 63616-byte allocation
09-06 22:32:45.736: I/dalvikvm-heap(11857): Clamp target GC heap from 48.757MB to 48.000MB
09-06 22:32:45.736: D/dalvikvm(11857): GC_BEFORE_OOM freed 0K, 6% free 46583K/49159K, paused 82ms, total 82ms
09-06 22:32:45.736: E/dalvikvm-heap(11857): Out of memory on a 63616-byte allocation.
09-06 22:32:45.736: I/dalvikvm(11857): "Thread-15874" prio=4 tid=49 RUNNABLE
谁能告诉它为什么会泄漏内存?
【问题讨论】:
-
无论如何我都不清楚 - 我会说(就像我经常做的那样)添加一些 Log.d - 可疑区域可能是 removeAllViews()、imageLoader()。
-
将 logcat 输出添加到问题中。
-
是的 - 看起来像是 imageLoader ......图像有多大?我也会在该代码周围放置一个 try-catch (但您显然会得到与 log cat 相同的错误消息,但这可以帮助确定它。)您是否尝试过压缩位图或使用位图缓存? (我最近也有类似的头痛:)
-
我不认为是图像的大小导致了问题。这里还有其他问题。因为,我试图在 ddms 和 MAT 中对此进行分析,并注意到第一次活动打开时占用 10mb,下次打开时变为 15mb,然后在下一次打开时为 20mb,当达到 40mb 时,它会因 OOM 错误而崩溃。每当我关闭活动时,GC 不应该清除内存吗?
-
GC 有自己的想法……请注意堆钳位和软引用。泄漏来自非常大的东西 - 可能只是应用程序及其资源、图像或两者兼而有之。 (或者您不小心踩到的操作系统错误/疏忽 - 不太可能。)您是否尝试过逐段注释代码直到崩溃消失?
标签: android memory-leaks out-of-memory