gpt4 book ai didi

android - 使用位图和 Volley 查看寻呼机内存泄漏

转载 作者:太空宇宙 更新时间:2023-11-03 12:56:12 25 4
gpt4 key购买 nike

我正在使用 View Pager 在我的应用程序中显示从网络下载的图像。图像的数量可以是 5 到 20。我正在使用 Volley 库来进行网络操作。该应用程序之前没有占用太多内存,但现在在添加 View 寻呼机后,该应用程序占用了大量内存,每次我打开此 Activity 时,堆中使用的内存都会增加(从日志消息中检查)。我还使用 Eclipse 内存分析器来检查泄漏的位置,它肯定是位图和此 Activity 的多个实例。肯定有泄漏,因为这个 Activity 没有得到 GC,一些引用阻止它被垃圾收集。我已经在此处添加了 View 寻呼机的实现。

public class ViewPagerAdapter extends PagerAdapter {
Context context;

public ViewPagerAdapter(Context context) {
this.context = context;
}

@Override
public int getCount() {
return photoReferences.size();
}

@Override
public boolean isViewFromObject(View view, Object object) {
return view == ((RelativeLayout) object);
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
final ImageView im;
final ProgressBar pb;

View itemView = inflater.inflate(R.layout.place_photos_item, container, false);

im = (ImageView) itemView.findViewById(R.id.placeImage);
attributes = (TextView) itemView.findViewById(R.id.placeAttributes);
pb = (ProgressBar) itemView.findViewById(R.id.progressBarPhoto);

imageLoader.get(url, new ImageListener() {

public void onErrorResponse(VolleyError arg0) {
im.setImageResource(R.drawable.onErrorImage);
}

public void onResponse(ImageContainer response, boolean arg1) {
if (response.getBitmap() != null) {
im.startAnimation(AnimationUtils.loadAnimation(context, android.R.anim.fade_in));
im.setImageBitmap(response.getBitmap());
pb.setVisibility(View.GONE);
}
}
});

((ViewPager) container).addView(itemView);

return itemView;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
((ViewPager) container).removeView((RelativeLayout) object);
}

}

此外,我使用的位图缓存大小是屏幕字节数的 3 倍(屏幕宽度 * 屏幕高度 * 4)。我正在运行 4.3 的 Nexus 4 上进行测试,我从未遇到过 OOM 异常,因为此设备上的堆大小很大,但如果我打开 Activity ,该应用程序可能占用超过 100 mb 的内存(它会在大多数设备上崩溃)一次又一次,之前无论如何都要占用大约 16-20 mbs 的内存。这是缓存代码。

public class BitmapCache extends LruCache<Object, Object> implements ImageCache {
public BitmapCache(int maxSize) {
super(maxSize);
}

@Override
public Bitmap getBitmap(String url) {
return (Bitmap) get(url);
}

@Override
public void putBitmap(String url, Bitmap bitmap) {
put(url, bitmap);
}
}

任何人都可以建议我应该怎么做才能捕获泄漏? View Pager 或我的 Volley 使用有什么问题吗?我对 Pager 的转换也不满意,有点滞后,这是否相关?

更新: Here's the screenshot of MAT, possible leak .这适用于使用 Volley 库的每个 Activity 。我一直在阅读很多,但我无法解决问题。截击导致泄漏还是我做错了什么?

最佳答案

您可以使用 MAT 找到泄漏点。首先,您运行您的应用程序并泄漏一些 Activity 实例。然后你抓取堆的快照并寻找那些泄漏的 Activity 对象......你可以使用“对象查询语言”(OQL)按类型查找它们(例如“SELECT * FROM com.foo.FooActivity”)。

找到泄漏的对象后,右键单击它并要求 MAT 将其所有传入引用追溯到它们的 GC 根。泄漏的引用将是其中之一。

为了更好地介绍该技术,您可以试试这篇文章:

http://android-developers.blogspot.co.uk/2011/03/memory-analysis-for-android.html

关于android - 使用位图和 Volley 查看寻呼机内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19916337/

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