[douban] 01_我的资料头像-图片异步加载

Android 4.0

图片异步加载

异步图片加载
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);