我正在使用 View Pager 在我的应用程序中显示从网络下载的图像。图片的数量可以从 5 到 20。我正在使用 Volley 库来进行网络操作。该应用程序之前并没有占用太多内存,但现在在添加视图寻呼机后,该应用程序占用了大量内存,每次我打开此活动时,堆中使用的内存都会增加(从日志消息中检查)。我还使用 Eclipse 内存分析器来检查泄漏的位置,它肯定是位图和此活动的多个实例。肯定有泄漏,因为这个活动没有被垃圾回收,一些引用阻止它被垃圾收集。我在这里添加了视图寻呼机的实现。
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);
}
}
另外,我使用的位图缓存大小是 screenBytes 数量的 3 倍(screenWidth * screenHeight * 4)。我正在运行 4.3 的 Nexus 4 上进行测试,我从未遇到过 OOM 异常,因为此设备上的堆大小很大,但如果我打开活动,应用程序可能会占用超过 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 的过渡也不满意,有点滞后,这有关系吗?
更新: 这是 MAT 的截图,可能泄漏。这适用于使用 Volley 库的每个活动。我已经阅读了很多,但我无法解决问题。凌空是造成泄漏还是我做错了什么?