异步任务(LoadAsyncTask)
好久没更新了,最近单位很忙,这节我们主要实现图片的异步加载,首先我们简要的介绍一下异步任务:
AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.
AsyncTask定义了三种泛型类型 Params,Progress和Result。
1. Params 启动任务执行的输入参数,比如HTTP请求的URL。
2. Progress 后台任务执行的百分比。
3. Result 后台执行任务最终返回的结果,比如String。
遵守准则
1. Task的实例必须在UI thread中创建
2.execute方法必须在UI thread中调用
3.不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params…), onProgressUpdate(Progress…)这几个方法.
4.该task只能被执行一次,否则多次调用时将会出现异常
下面给出我写的图片加载的异步任务类:
public class LoadAsyncTask extends AsyncTask<Object,Void,Bitmap> {
private ImageItem mImageItem;
private GridView mPhotoWall;
public LoadAsyncTask() {
}
@Override
protected Bitmap doInBackground(Object... params) {
mImageItem = (ImageItem)params[0];
mPhotoWall = (GridView) params[1];
Bitmap bitmap= null;
if (mImageItem.isNet()){
//加载网络图片
//先从内存缓存里找,如果没有就找硬盘缓存,如果还没有就下载
}else {
bitmap = LruCache.getInstance().getBitmapFromMemoryCache(mImageItem.getPath());
if (bitmap == null){
bitmap=PhotoBitmapFactory.getInstance().getImageThumbnail(mImageItem.getId(),mImageItem.getPath(),GlobalDefineValues.SINGLE_ALBUM_PHOTO_GRIDVIEW_CELL_WIDTH,GlobalDefineValues.SINGLE_ALBUM_PHOTO_GRIDVIEW_CELL_HEIGHT,false);
if (bitmap != null) {
// 图片下载完成后缓存到LrcCache中
com.tt.ansyphotodemo.LruCache.getInstance().addBitmapToLruCache(mImageItem.getPath(), bitmap);
}
}
}
if (bitmap == null){
return null;
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
ImageView imageView = (ImageView) mPhotoWall.findViewWithTag(mImageItem.getPath());
if (imageView != null && bitmap != null) {
imageView.setImageBitmap(bitmap);
}
LoadAsyncTaskManager.getInstance().removeLoadAsyncTask(this);
}
}
接下来是异步任务的管理类:
public class LoadAsyncTaskManager {
private static Set<LoadAsyncTask> taskCollection;
private static LoadAsyncTaskManager mLoadAsyncTaskManager = null;
private LoadAsyncTaskManager(){}
public static LoadAsyncTaskManager getInstance(){
if (mLoadAsyncTaskManager == null){
mLoadAsyncTaskManager = new LoadAsyncTaskManager();
}
if (taskCollection == null){
taskCollection = new HashSet<LoadAsyncTask>();
}
return mLoadAsyncTaskManager;
}
public void addLoadAsyncTask(LoadAsyncTask l){
taskCollection.add(l);
}
public void cancelAllTasks() {
if (taskCollection != null) {
for (LoadAsyncTask task : taskCollection) {
task.cancel(false);
}
}
}
public void removeLoadAsyncTask(LoadAsyncTask l){
taskCollection.remove(l);
}
}