异步任务AsyncTask注意事项:
必须在UI线程中创建AsyncTask的实例。
必须载UI线程中调用AsyncTask的execute()方法。
重写的四个方法是系统自动调用的,不应手动调用。doInBackground()、onProgressUpdate()、
每个AsyncTask只能被执行一次,多次调用将会引发异常。
doInBackground()方法是运行在其他线程,不能在这里更新UI。其他的方法都是运行在主线程。
异步加载
如何提高用户体验:
使用缓存
Lru算法:
Lru:Least Recently Used 近期最少使用算法
Android提供了LruCache类来实现这个缓存算法
public class ImageLoader {
private LruCache<String, Bitmap> mCaches;
public ImageLoader(){
int maxMemory = Runtime.getRuntime().maxMemory(); //获取最大可用内存
int cacheSize = maxMemory / 4; //最大内存的四分之一大小作为缓存
mCaches = new LruCache<String,Bitmap>(cacheSize);
@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<NewsBean> data, Listview listview){
mList = data;
mInflater = LayoutInflater.from(context);
mImageLoader = new ImageLoader();
URLS = new String[data.size()];
for (int i = 0; i<data.size(); 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<end; 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,任何控件都可以使用异步加载