最后在实现一个无限循环的ViewPager,展示图片,功能实现了,但是运行一段时间之后会挂掉。
多亏了AndroidStudio的Memory Monitor,发现了内存一直在增长。
怎么触发gc内存都不会减少,确定了内存泄露了,但是不知哪里出问题了。
一时想到的排查内存泄露的工具,就是MAT了,但是没找到AndroidStudio的MAT插件。
只能先把java heap dump出来先,如下图所示
dump出来之后,hprof文件会保存在项目下captures目录,之前一直不知到,找了很久。。。
如果切换到Captures这个tab,是可以直接看到HeapSnapshot的,如下图所示
但是这个hprof文件mat不认,需要转换一下,点击hprof文件右键,转成标准.hprof文件即可
然后到eclipse用mat插件打开,如果没有安装mat插件请自行搜索解决
window->open perspective->memory analysis
在memory analysis界面下
File->Open Heap Dump->选中上面Android Studio转换之后的.hprof文件即可
在OverView下面点击Top Consumers, 如下图。byte占了大头,内存基本都给它用了
byte占用这么多内存,一想到的就是bitmap没被释放了。
回去研究我的代码
PagerAdapter代码如下
1 public class SlidePicPagerAdapter extends PagerAdapter { 2 3 private List<SlidePicModel> mItems; 4 private int itemSize; 5 6 public void setItems(List<SlidePicModel> items) { 7 mItems = items; 8 itemSize = items.size(); 9 } 10 11 @Override 12 public int getCount() { 13 return ListUtils.isEmpty(mItems) ? 0 : Integer.MAX_VALUE; 14 } 15 16 @Override 17 public boolean isViewFromObject(View view, Object object) { 18 return view == object; 19 } 20 21 @Override 22 public Object instantiateItem(ViewGroup container, int position) { 23 Context context = container.getContext(); 24 SlidePicModel item = mItems.get(getCurPos(position)); 25 ImageView iv = item.getImageView(); 26 if(iv == null){ 27 iv = new ImageView(context); 28 item.setImageView(iv); 29 } 30 final String imgUrl = ImageUrlExtends.getImageUrl(item.getUrl()); 31 Picasso.with(context).load(imgUrl).into(iv); 32 container.addView(iv); 33 return iv; 34 } 35 36 @Override 37 public void destroyItem(ViewGroup container, int position, Object object) { 38 View imageView = (View) object; 39 container.removeView(imageView); 40 } 41 42 43 private int getCurPos(int pos){ 44 return pos % mItems.size(); 45 } 46 }