1.浅谈AsyncTask

AsyncTask: 异步封装的工具, 可以实现异步请求及主界面更新(对线程池+handler的封装)
    三个泛型意义: 
    第一个泛型:doInBackground里的参数类型 
    第二个泛型:onProgressUpdate里的参数类型 
    第三个泛型:onPostExecute里的参数类型及doInBackground的返回类型
    示例:(解决图片错位问题)
    class BitmapTask extends AsyncTask<Object, Integer, Bitmap> {

        private ImageView imageView;
        private String url;

        // 1.预加载, 运行在主线程
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        // 2.正在加载, 运行在子线程(核心方法), 可以直接异步请求
        @Override
        protected Bitmap doInBackground(Object... params) {
            imageView = (ImageView) params[0];
            url = (String) params[1];

            imageView.setTag(url);// 打标记, 将当前imageview和url绑定在了一起

            // 开始下载图片
            Bitmap bitmap = download(url);
            // publishProgress(values) 调用此方法实现进度更新(会回调onProgressUpdate)

            return bitmap;
        }

        // 3.更新进度的方法, 运行在主线程
        @Override
        protected void onProgressUpdate(Integer... values) {
            // 更新进度条
            super.onProgressUpdate(values);
        }

        // 4.加载结束, 运行在主线程(核心方法), 可以直接更新UI
        @Override
        protected void onPostExecute(Bitmap result) {
            // System.out.println("onPostExecute");

            if (result != null) {
                // 给imageView设置图片
                // 由于listview的重用机制导致imageview对象可能被多个item共用,
                // 从而可能将错误的图片设置给了imageView对象
                // 所以需要在此处校验, 判断是否是正确的图片
                String url = (String) imageView.getTag();

                if (url.equals(this.url)) {// 判断图片绑定的url是否就是当前bitmap的url,
                                            // 如果是,说明图片正确
                    imageView.setImageBitmap(result);
                    System.out.println("从网络加载图片啦!!!");

                    // 写本地缓存
                    mLocalCacheUtils.setLocalCache(url, result);
                    // 写内存缓存
                    mMemoryCacheUtils.setMemoryCache(url, result);
                }
            }

            super.onPostExecute(result);
        }

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值