Listview的异步加载性能优化

2019-12-10 19:13:23于海丽

Android中ListView是使用平率最高的控件之一(GridView跟ListView是兄弟,都是继承AbsListView),ListView优化最有效的无非就是采用ViewHolder来减少频繁的对view查询和更新,缓存图片加快解码,减小图片尺寸。

关于listview的异步加载,网上其实很多示例了,中心思想都差不多,不过很多版本或是有bug,或是有性能问题有待优化,下面就让在下阐述其原理以探索个中奥秘在APP应用中,listview的异步加载图片方式能够带来很好的用户体验,同时也是考量程序性能的一个重要指标。关于listview的异步加载,网上其实很多示例了,中心思想都差不多,不过很多版本或是有bug,或是有性能问题有待优化。有鉴于此,本人在网上找了个相对理想的版本并在此基础上进行改造,下面就让在下阐述其原理以探索个中奥秘,与诸君共赏…

异步加载图片基本思想:

1.先从内存缓存中获取图片显示(内存缓冲) 
2.获取不到的话从SD卡里获取(SD卡缓冲) 
3.都获取不到的话从网络下载图片并保存到SD卡同时加入内存并显示(视情况看是否要显示)

OK,先上adapter的代码:

public class LoaderAdapter extends BaseAdapter{ 
private static final String TAG = "LoaderAdapter"; 
private boolean mBusy = false; 
public void setFlagBusy(boolean busy) { 
this.mBusy = busy; 
} 
private ImageLoader mImageLoader; 
private int mCount; 
private Context mContext; 
private String[] urlArrays; 
public LoaderAdapter(int count, Context context, String []url) { 
this.mCount = count; 
this.mContext = context; 
urlArrays = url; 
mImageLoader = new ImageLoader(context); 
} 
public ImageLoader getImageLoader(){ 
return mImageLoader; 
} 
@Override 
public int getCount() { 
return mCount; 
} 
@Override 
public Object getItem(int position) { 
return position; 
} 
@Override 
public long getItemId(int position) { 
return position; 
} 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
ViewHolder viewHolder = null; 
if (convertView == null) { 
convertView = LayoutInflater.from(mContext).inflate( 
R.layout.list_item, null); 
viewHolder = new ViewHolder(); 
viewHolder.mTextView = (TextView) convertView 
.findViewById(R.id.tv_tips); 
viewHolder.mImageView = (ImageView) convertView 
.findViewById(R.id.iv_image); 
convertView.setTag(viewHolder); 
} else { 
viewHolder = (ViewHolder) convertView.getTag(); 
} 
String url = ""; 
url = urlArrays[position % urlArrays.length]; 
viewHolder.mImageView.setImageResource(R.drawable.ic_launcher); 
if (!mBusy) { 
mImageLoader.DisplayImage(url, viewHolder.mImageView, false); 
viewHolder.mTextView.setText("--" + position 
+ "--IDLE ||TOUCH_SCROLL"); 
} else { 
mImageLoader.DisplayImage(url, viewHolder.mImageView, true); 
viewHolder.mTextView.setText("--" + position + "--FLING"); 
} 
return convertView; 
} 
static class ViewHolder { 
TextView mTextView; 
ImageView mImageView; 
} 
}