Android ListView使用convertView解决内存溢出问题(推介使用recyclerview,listview已过时)
2015-12-22 14:27
731 查看
比方说在加载各种图片的时候,listview不及时回收的话,可能会造成内存溢出,这个时候就是看getview方法的时候了。
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if(convertView == null){
// 不存在则加载新布局
LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.item_pic_list, null);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.item_title);
holder.image = (ImageView) convertView.findViewById(R.id.item_image);
convertView.setTag(holder);
} else {
// 存在则加载原来布局,布局重用,无需重复加载
holder = (ViewHolder) convertView.getTag();
}
int no = position + 1;
holder.text.setText("图片列表测试:" + no);
// ir是i5suoi库中ImageResource的实例,专门负责单例加载图片资源,并及时释放长时间不用的图片内存
// 先设置成默认图片,以便能够将列表中不显示在屏幕上的图片及时回收
holder.image.setImageBitmap(ir.getBitmap(getResources(), R.drawable.ic_launcher));
// 加载并显示网络图片,每个图片只加载一次,然后存到本地缓存
ir.getBitmap(holder.image, pic.replace("_num", "" + no % 60),
holder.image.getWidth(), holder.image.getHeight());
return convertView;
}
代码注释很清晰,这里就不多做解释,只说一些注意事项。首先是本地的图片也要用ImageResource加载,才能保证每个图片只加载一次,不浪费资源和内存。其次,也是最重要的,虽然不用每次重新加载布局,但是有必要将图片重新设置成默认的,表示原来的图片暂不使用了,以便系统能够在内存使用过大时及时收回当前界面不使用的图片。
最后,如果上述你都做到的话,你的listview已经优化的很好了。针对你的问题,你的listview控件高度是否设置为fill_parent,因为warp会导致listview滑动中无限计算自身高度。你的文本加载是否做过线程以及多次重复加载的问题处理。你的item中变量是否多次无限生成新的内存对象等等。
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if(convertView == null){
// 不存在则加载新布局
LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.item_pic_list, null);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.item_title);
holder.image = (ImageView) convertView.findViewById(R.id.item_image);
convertView.setTag(holder);
} else {
// 存在则加载原来布局,布局重用,无需重复加载
holder = (ViewHolder) convertView.getTag();
}
int no = position + 1;
holder.text.setText("图片列表测试:" + no);
// ir是i5suoi库中ImageResource的实例,专门负责单例加载图片资源,并及时释放长时间不用的图片内存
// 先设置成默认图片,以便能够将列表中不显示在屏幕上的图片及时回收
holder.image.setImageBitmap(ir.getBitmap(getResources(), R.drawable.ic_launcher));
// 加载并显示网络图片,每个图片只加载一次,然后存到本地缓存
ir.getBitmap(holder.image, pic.replace("_num", "" + no % 60),
holder.image.getWidth(), holder.image.getHeight());
return convertView;
}
代码注释很清晰,这里就不多做解释,只说一些注意事项。首先是本地的图片也要用ImageResource加载,才能保证每个图片只加载一次,不浪费资源和内存。其次,也是最重要的,虽然不用每次重新加载布局,但是有必要将图片重新设置成默认的,表示原来的图片暂不使用了,以便系统能够在内存使用过大时及时收回当前界面不使用的图片。
最后,如果上述你都做到的话,你的listview已经优化的很好了。针对你的问题,你的listview控件高度是否设置为fill_parent,因为warp会导致listview滑动中无限计算自身高度。你的文本加载是否做过线程以及多次重复加载的问题处理。你的item中变量是否多次无限生成新的内存对象等等。
相关文章推荐
- Android之ListView原理学习与优化总结
- Android ListView的性能优化(ViewHolder和HashMap)
- [Android]ListView性能优化之视图缓存
- 对android应用进行单元测试
- Android 控件之点击链接跳转Activity
- 深入理解Android Studio之Gradle
- 基于Android热点的局域网UDP广播,部分手机收不到UDP报文的问题
- Android Studio遇到了一些小困惑
- 基于Android如何实现将数据库保存到SD卡
- View篇——索引列实现思想以及个人优化方式
- android 修改framework下资源文件后如何编译
- android 修改framework下资源文件后如何编译
- 工厂模式
- Android中进程线程调度的命令之cgroups
- android-ScrollView中嵌套ListView,item显示不全及第二页(超过一屏)显示不全
- 利用AndroidTestCase来做单元测试
- Android RadioButton与ListView的混合使用
- android黑科技之读取用户短信+插入短信到系统短信数据库
- [Android][Fatal Exception] android.content.res.Resources$NotFoundException 问题及解决方法
- Android WebView远程执行代码漏洞浅析