我正在使用 View Pager 在我的应用程序中显示从网络下载的图像。图像的数量可以是 5 到 20。我正在使用 Volley 库来进行网络操作。该应用程序之前并没有占用太多内存,但现在添加视图寻呼机后,该应用程序占用了大量内存,每次我打开此活动时,堆中使用的内存都会增加(从日志消息中检查)。我还使用 Eclipse 内存分析器来检查泄漏位置,肯定是位图和该活动的多个实例。肯定存在泄漏,因为此活动没有被 GC 处理,一些引用阻止了它被垃圾收集。我在这里添加了视图寻呼机的实现。
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 使用有什么问题吗?我对寻呼机的转换也不满意,有点滞后,这有关系吗?
Update: 这是 MAT 的屏幕截图,可能存在泄漏 http://imgur.com/tu5TMoS。这是关于使用 Volley 库的每个活动。我读了很多书,但无法解决问题。齐射导致泄漏还是我做错了什么?