优化ListView中的网络图片加载

本文地址:http://blog.csdn.net/mba16c35/article/details/43707407

使用适当的开源库,如Volley或者Universal ImageLoader

使用开源库可以支持两点:多线程下载图片+缓存图片机制
另外还有一点优化:如果列表在滑动的时候可以停止图片加载
多图的listview容易发生OOM,防止OOM的方式:根据runtime大小设置缓存上限

以Volley库为例, 使用Volley时,可以覆写Activity或者Fragment中的onScrollStateChanged,如果处于AbsListView.OnScrollListener.SCROLL_STATE_FLING的状态,则imageLoader.stopProcessingQueue()(停止网络图片加载)。 imageLoader是NetworkImageView的一个引用,负责加载图片,这样在快速滑动时就不会加载图片。

public class MyImageLoader extends ImageLoader {
	
	/**
	 * 每个activity把自己的context作为参数生成imageloader,保证每个requestqueue是属于activity的
	 * 退出activity后所有request都取消掉
	 * @param ct
	 */
	public MyImageLoader(Context ct) {
		super(MyRequestQueue.newInstance(ct), MyImageCache.getInstance());
	}

	public void stopProcessingQueue() {
		getRequestQueue().stop();
	}

	public void startProcessingQueue() {
		getRequestQueue().start();
	}
}

另外也同样可以在Adapter中设置标志位,表示是否正在快速滑动,如果正在快速滑动,Adapter中的getView只需要把TextView等简单数据显示出来,把复杂逻辑和onClickListener等移到非Fling状态时才设置。


关于Volley的介绍可以看这篇博客:http://blog.csdn.net/t12x3456/article/details/9221611

关于Volley的源码分析可以看我的博客:http://blog.csdn.net/mba16c35/article/details/43944703

采用扁平化的布局

层层嵌套的布局会花费很多渲染时间。

使用merge标签

一个常见的不需要嵌套的例子是使用FrameLayout作为布局的单一根节点,当该布局被添加到一个父容器时,它就会成为冗余。更好的做法是使用merge标签。当包含有merge标签的布局被添加到另一个布局时,该布局的merge节点会被删除,而该布局的子View会被直接添加到新的父布局中。

mege标签结合include标签一起使用可以复用布局同时,减少嵌套

include标签可以把一个布局的内容插入到另一个布局。利用include标签可以在垂直和水平方向的不同布局中共享大多数UI布局。

延迟加载

View Stub是一个可见的、大小为0的View,它就像一个延迟填充的include标签,只有在显示调用inflate方法或者被置为可见是,这个stub才被填充。

更多详解介绍可以参考:《Android4高级编程》P90,《Android优化技术详解》P76


注意Adapter的getView函数的编写

(1)复用convertView。convertView是ListView的RecycleBin内部类帮我们缓存的,如果ListView的不同列表项有不同的类型,可以在Apdater的getViewTypeCount中返回类型数,ListView会根据不同类别分别缓存。可以看我之前对ListView源代码的分析:http://blog.csdn.net/mba16c35/article/details/43638793

(2)使用静态内部类ViewHolder。新建列表项视图的各项子视图都存在ViewHolder中,然后setTag,下次直接通过

ItemViewHolder holder = (ItemViewHolder) convertView.getTag();
就省去了findViewById的步骤。


下面是一段示例代码。XXNetworkImageView继承Volley中的NetworkImageView。

@Override
	public View getView(int position, View convertView, ViewGroup parent) 
	{	 
        if (convertView==null)
        {
			convertView = mInflater.inflate(layoutID, null);
			ItemViewHolder holder = new ItemViewHolder();
			holder.bookCover = (XXNetworkImageView) convertView.findViewById(R.id.book_booklist_cover);  
			holder.bookName = (TextView) convertView.findViewById(R.id.book_booklist_name); 
			holder.bookClickNumber = (TextView) convertView.findViewById(R.id.book_booklist_clicknumber); 
			holder.bookType = (TextView) convertView.findViewById(R.id.book_booklist_type); 
			holder.bookAuthor = (TextView) convertView.findViewById(R.id.book_booklist_author); 
			holder.bookState = (ImageView) convertView.findViewById(R.id.book_booklist_state); 
			convertView.setTag(holder);
        }
    
        bindView(convertView, position);
             
		return convertView;
	}
	private void bindView(View convertView, int position) {
		ItemViewHolder holder = (ItemViewHolder) convertView.getTag();
		String imageUrl = (String) Util.IMG_URL_PREFIX + bookList.get(position).getImgUrl();
		String currentUrl = holder.bookCover.getUrl();
        if (currentUrl == null || !currentUrl.equals(imageUrl)) {
        	if (mContext != null) {
        		holder.bookCover.setImageUrl(imageUrl, imageLoader, Util.dip2px(mContext, 95));
        	} else {
        		holder.bookCover.setImageUrl(imageUrl, imageLoader);
        	}
        }

		holder.bookName.setText(String.valueOf(bookList.get(position).getName()));
		holder.bookClickNumber.setText(String.valueOf(bookList.get(position).getFreePage()));
		holder.bookType.setText("类型: "+ String.valueOf(bookList.get(position).getTypes()));
		holder.bookAuthor.setText("作者: " + String.valueOf(bookList.get(position).getAuthor()));
        
        if(String.valueOf(bookList.get(position).getScale()).equals("0"))
        	holder.bookState.setImageResource(R.drawable.tag0);
//        else if(String.valueOf(bookListData.get(position).get("state")).equals("1"))
//        	holder.bookState.setImageResource(R.drawable.tag);
	}
	
	static class ItemViewHolder {
		XXNetworkImageView bookCover;  
		TextView bookName; 
		TextView bookClickNumber; 
		TextView bookType; 
		TextView bookAuthor; 
		ImageView bookState; 
    }


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆业聪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值