异步任务AsyncTask注意事项:
必须在UI线程中创建AsyncTask的实例。
必须载UI线程中调用AsyncTask的execute()方法。
重写的四个方法是系统自动调用的,不应手动调用。doInBackground()、onProgressUpdate()、
每个AsyncTask只能被执行一次,多次调用将会引发异常。
doInBackground()方法是运行在其他线程,不能在这里更新UI。其他的方法都是运行在主线程。
异步加载
如何提高用户体验:
使用缓存
Lru算法:
Lru:Least Recently Used 近期最少使用算法
Android提供了LruCache类来实现这个缓存算法
public class ImageLoader {
private LruCache
public ImageLoader(){
int maxMemory = Runtime.getRuntime().maxMemory(); //获取最大可用内存
int cacheSize = maxMemory / 4; //最大内存的四分之一大小作为缓存
mCaches = new LruCache
@Override
protected int sizeOf(String key, Bitmap value){
//在每次存入缓存的时候调用
return value.getByteCount(); //将Bitmap实际大小保存进去
}
}
//增加到缓存,增加之前先判断当前缓存是否存在
public void addBitmapToCache(String url, Bitmap bitmap){
if (getBitmapFromCache(url)==nulll){
mCache.put(url, bitmap);
}
}
//从缓存中获取数据
public Bitmap getBitmapFromCache(String url){
return mCache.get(url);
}
}
如何提高效率:
ListView滑动停止后才加载可见项
ListView滑动时,取消所有加载项
private int mStart,mEnd;
public static String[] URLS;
private boolean mFirstIn;
public NewsAdapter(Context context, List
mList = data;
mInflater = LayoutInflater.from(context);
mImageLoader = new ImageLoader();
URLS = new String[data.size()];
for (int i = 0; i URLS[i] = data.get(i).newsIconUrl; mFirstIn = true; } } //将mTask中所有任务取消 public void cancelAllTask(){ in (mTask != null){ for (NewAsyncTask task : mTask) { task.cancel(false); } } } public void loadImages(int start, int end){ for (int i = start; i String url = newsAdatper.URLS[i]; } } public void onScrollStateChanged(AbsListView view, int scrollState){ if (scrollState == SCROLL_STATE_IDEL){ //滚动完后,加载可见项 mImageLoader.loadImages(mStart, mEnd); } else { //其他时间停止加载任务 mImageLoader.cancelAllTask } } } public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItem){ mStart = firstVisibleItem; mEnd = firstVisibleItem + visibleItemCount; //第一个可见元素加上可见元素的数量 //第一次显示的时候调用 if (mFirstIn && visibleIntemCount >0){ mImageLoader.loadImages(mStart, mEnd); mFristIn = false; } } 总结: 通过异步加载,避免阻塞UI线程 通过LruCache,将已下载图片放到内存中 通过判断ListView滑动状态,决定何时加载图片 不仅仅是ListView,任何控件都可以使用异步加载