图片异步加载
异步图片加载 AsyncTask,接口回调 |
代码: package cn.zengfansheng.douban.utils;
import android.os.AsyncTask;
/**
* 异步加载图片
*
* @author hacket
*
* 参数一:传入的参数(就是图片下载路径的url)
*
* 参数二:进度值(下载的进度)
*
* 参数三:返回的结果值 (异步任务执行完毕后的返回值)
*
*/
public class LoadImageAsynTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> {
private final LoadImageAsynTaskCallback<Result> callback;
public LoadImageAsynTask(LoadImageAsynTaskCallback<Result> callback) {
this.callback = callback;
}
/**
* 图片加载异步接口
*/
public interface LoadImageAsynTaskCallback<Result> {
/**
* 开始加载之前,调用的方法
*/
public abstract void beforeLoadImage();
/**
* 加载完毕后,调用的方法
*
* @param bitmap
*/
public abstract void afterLoadImage(Result bitmap);
}
// 当异步任务执行之前调用
@Override
protected void onPreExecute() {
// 初始化的操作具体怎么去实现, LoadImageAsynTask 不知道
// 需要让调用这个 LoadImageAsynTask 的人去实现
callback.beforeLoadImage();
}
// 后台任务执行时,发布进度
@Override
protected void onProgressUpdate(Progress... values) {
}
// 后台子线程运行的异步任务 ,子线程
@Override
protected Result doInBackground(Params... params) {
// TODO 耗时,后台操作
return null;
}
// 异步任务执行之后调用
@Override
protected void onPostExecute(Result result) {
callback.afterLoadImage(result);
}
} |
使用: // 异步加载图片
new LoadImageAsynTask<String,Integer,Bitmap>(new LoadImageAsynTaskCallback<Bitmap>() {
@Override
public void beforeLoadImage() {
iv_icon.setImageResource(R.drawable.ic_launcher);
}
@Override
public void afterLoadImage(Bitmap bitmap) {
iv_icon.setImageBitmap(bitmap);
}
}){
@Override
protected Bitmap doInBackground(String... params) {
try {
String imageUrl = params[0];
URL url = new URL(imageUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
InputStream is = conn.getInputStream();
return BitmapFactory.decodeStream(is);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return super.doInBackground(params);
}
}.execute(iconurl);
|