ListView AsynTask异步加载网络Json格式数据和图片显示的优化

这是一个慕课网关于AsynTask的教程代码。
慕课网连接
项目源码
https://pan.baidu.com/s/1b9FLAe
密码k6xh
工具类ImageLoad.java

/**
 * Created by yipai on 16/11/30.
 */

public class ImageLoad {
    /**
     * 实现异步加载一共有两种方式,一种是多线程方式第二种就是通过AsynTask
     */

    private ImageView mImageView;
    private String mUrl;
    //创建缓存
    private LruCache<String, Bitmap> mCache;
    private ListView mListView;
    private Set<ImageAsyncTack> mTask;

    public ImageLoad(ListView listView) {
        mListView = listView;
        mTask = new HashSet<>();
        //获取最大可用内存
        int maxMenmory = (int) Runtime.getRuntime().maxMemory();
        Log.e("tag", "可用缓存大小为   " + (maxMenmory / 1048576) + "MB");
        //设置缓存大小
        int cacheSize = maxMenmory / 2;
        //初始化缓存
        mCache = new LruCache<String, Bitmap>(cacheSize) {
            @Override
            protected int sizeOf(String key, Bitmap value) {
                //在每次存入缓存是调用
                return value.getByteCount();//返回图片大小
            }
        };
    }

    /**
     * 用来加载充start到end位置的图片
     *
     * @param start
     * @param end
     */
    public void loadImage(int start, int end) {
        for (int i = start; i < end; i++) {
            //取出开始到结束的图片对应的url地址
            String url = MyAdapter.mAllUrl[i];
            Bitmap bitmap = getBitmapFromCache(url);

            //如果缓存中没有对应的图片,那么必须去直接下载
            if (bitmap == null) {
                Log.e("tag", "缓存中没有对应的图片");

                ImageAsyncTack imageAsyncTack = new ImageAsyncTack(url);
                imageAsyncTack.execute(url);
                mTask.add(imageAsyncTack);

            } else {
                //如果缓存中有,那么直接从缓存中加载图片
                Log.e("tag", "直接从缓存中加载图片");

                ImageView imageView = (ImageView) mListView.findViewWithTag(url);
                imageView.setImageBitmap(bitmap);
            }
        }
    }

    /**
     * 增加缓存
     *
     * @param url
     * @param bitmap
     */
    public void addBitmapToCache(String url, Bitmap bitmap) {

        //判断当前缓存是否存在,如果不存在那么进行缓存
        if (getBitmapFromCache(url) == null) {
            Log.e("tag", "缓存下载的图片");

            mCache.put(url, bitmap);
        }
    }

    /**
     * 读取缓存
     *
     * @param url
     * @return
     */
    public Bitmap getBitmapFromCache(String url) {

        return mCache.get(url);
    }

    private Handler mHandle = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (mImageView.getTag().equals(mUrl)) {
                mImageView.setImageBitmap((Bitmap) msg.obj);

            }
        }
    };

    //使用多线程实现异步加载
    public void showImageByThread(ImageView imageView, final String url) {

        //将传递过来的数据保存起来
        mImageView = imageView;
        mUrl = url;
        new Thread() {
            @Override
            public void run() {
                super.run();

                Bitmap bitmap = getBitmapForUrl(url);

                Message msg = Message.obtain();//可以使用现有的Message提高message使用效率

                msg.obj = bitmap;

                mHandle.sendMessage(msg);
            }
        }.start();
    }

    /**
     * 通过url获取Bitmap对象
     *
     * @param url
     * @return
     */
    public Bitmap getBitmapForUrl(String url) {
        Bitmap bitmap;
        InputStream inputStream = null;
        try {
            URL mUrl = new URL(url);

            HttpURLConnection httpURLConnection = (HttpURLConnection) mUrl.openConnection();

            inputStream = new BufferedInputStream(httpURLConnection.getInputStream());

            bitmap = BitmapFactory.decodeStream(inputStream);

            httpURLConnection.disconnect();

            return bitmap;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                assert inputStream != null;
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
        return null;//默认情况下
    }

    public void showImageViewByAsynTask(ImageView imageView, final String url) {

        Bitmap bitmap = getBitmapFromCache(url);
        //如果缓存中没有对应的图片,那么必须去直接下载
        if (bitmap == null) {
            Log.e("tag", "缓存中没有对应的图片");
            imageView.setImageResource(R.mipmap.ic_launcher);

        } else {
            //如果缓存中有,那么直接从缓存中加载图片
            Log.e("tag", "直接从缓存中加载图片");

            imageView.setImageBitmap(bitmap);
        }
    }

    public void canceAllTask() {
        if (mTask != null) {
            //foreach循环取出mTask集合中所有任务
            for (ImageAsyncTack task : mTask) {

                //取消任务
                task.cancel(false);
            }
        }
    }

    private class ImageAsyncTack extends AsyncTask<String, Void, Bitmap> {

        private String mUrl;

        public ImageAsyncTack(String mUrl) {
            this.mUrl = mUrl;
        }

        @Override
        protected Bitmap doInBackground(String... strings) {
            String url = strings[0];
            //从网络获取图片,如果图片存在,那么把图片下载后传入缓存中
            Bitmap bitmap = getBitmapForUrl(url);
            if (bitmap != null) {
                Log.e("tag", "把图片加入到缓存中去");
                addBitmapToCache(url, bitmap);
            }

            return bitmap;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            ImageView imageView = (ImageView) mListView.findViewWithTag(mUrl);
            if (imageView != null && bitmap != null) {
                imageView.setImageBitmap(bitmap);
            }
            //从集合中移除以加载完成的事务
            mTask.remove(this);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值