美文网首页
自定义图片框架SmartImageView&&图片一级缓存

自定义图片框架SmartImageView&&图片一级缓存

作者: MengkZhang | 来源:发表于2019-05-10 18:38 被阅读0次

图片显示的原理:mImageView.setImageBitmap(bitmap);
把服务器返回的InputStream数据写到一个文件file
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath())即可

继承ImageView实现逻辑
子线程请求网络 主线程更新UI

@SuppressLint("AppCompatCustomView")
public class MySmartImageView extends ImageView {

    @SuppressLint("HandlerLeak")
    Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {

                case 3://请求失败 显示一个默认图片
                    int resource =  (Integer) msg.obj;
                    MySmartImageView.this.setBackgroundResource(resource);
                    break;


                case 4://获取显示bitmap
                    Bitmap bitmap = (Bitmap) msg.obj;
                    MySmartImageView.this.setImageBitmap(bitmap);
                    break;
            }
        }
    };

    private Activity mActivity;

    // 一个参数的构造方法 在new 代码初始化的时候调用
    public MySmartImageView(Context context) {
        super(context);
        mActivity = (Activity) context;
    }

    // 这个类 在布局文件中使用的时候 调用2个参数构造方法
    public MySmartImageView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        mActivity = (Activity) context;
    }

    public MySmartImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mActivity = (Activity) context;
    }

    public void setImageUrl(final String path, final int source) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                String path = "https://img.haomeiwen.com/i5914881/8e0f627c5963bd0d.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp";
                File file = new File(mActivity.getCacheDir(), Base64.encodeToString(path.getBytes(), Base64.DEFAULT));

                //使用缓存数据
                if (file.exists() && file.length() >0) {
                    Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
                    Message message = mHandler.obtainMessage();
                    message.obj = bitmap;
                    message.what = 4;
                    mHandler.sendMessage(message);
                    return;
                }
                //请求网络数据
                try {
                    URL url = new URL(path);
                    HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                    httpURLConnection.setRequestMethod("GET");
                    int responseCode = httpURLConnection.getResponseCode();
                    if (responseCode == 200) {
                        InputStream inputStream = httpURLConnection.getInputStream();
                        FileOutputStream fos = new FileOutputStream(file);
                        int len = -1;
                        byte[] buffer = new byte[1024];
                        while ((len = inputStream.read(buffer)) != -1) {
                            fos.write(buffer,0,len);
                        }
                        fos.close();
                        inputStream.close();

                        final Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());

                        Message message = mHandler.obtainMessage();
                        message.obj = bitmap;
                        message.what = 4;
                        mHandler.sendMessage(message);

//                        runOnUiThread(new Runnable() {
//                            @Override
//                            public void run() {
//                                mImageView.setImageBitmap(bitmap);
//                            }
//                        });

                    } else {
                        sendErrorPic(source);
                    }

                } catch (MalformedURLException e) {
                    e.printStackTrace();
                    sendErrorPic(source);
                } catch (IOException e) {
                    e.printStackTrace();
                    sendErrorPic(source);
                }
            }
        }).start();
    }

    private void sendErrorPic(int source) {
        Message message = mHandler.obtainMessage();
        message.obj = source;
        message.what = 3;
        mHandler.sendMessage(message);
    }

}

调用

    public void myImageView(View view) {
        String path = "https://img.haomeiwen.com/i5914881/8e0f627c5963bd0d.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp";
        mMySmartImageView.setImageUrl(path,R.mipmap.ic_launcher);
    }

程序源码:https://github.com/MengkZhang/base_demo/tree/fb50febf97246f7bed2e129d2bc496000ae1c8a5

相关文章

  • 自定义图片框架SmartImageView&&图片一级缓存

    图片显示的原理:mImageView.setImageBitmap(bitmap);把服务器返回的InputStr...

  • 多线程03

    SDWebImage框架详解 下载图片并显示: 下载图片/显示图片/内存缓存/磁盘缓存 下载图片\内存缓存\磁盘缓...

  • 架构&框架

    图片缓存 怎样设计一个图片缓存框架 图片管理者模块:内存缓存模块、磁盘缓存模块、网络图片下载模块 图片处理:图片解...

  • 图片下载缓存思路

    自定义NSOperation下载图片思路 – 无沙盒缓存 自定义NSOperation下载图片思路 – 有沙盒缓存

  • iOS-常用框架解读

    一、框架&架构作用 模块化 分层 解耦 降低代码重合度 二、图片缓存框架 怎样设计一个图片缓存框架? 2.1 图片...

  • 一款神级选择图片工具,支持所有主流图片缓存框架

    今天介绍一个Android相册自定义,包括拍照、图片选择(单选/多选)和裁剪,支持所有主流图片缓存框架的工具。 A...

  • 基于RxJava2的轻量级图片缓存框架

    基于RxJava2的轻量级图片缓存框架 Android的图片缓存框架有很多,在Universal-Image-Lo...

  • 架构相关

    一、图片缓存框架面试题 问题1:怎样设计一个图片缓存框架? 问题2:图片通过什么方式进行读写,过程是怎样的? 读写...

  • 图片缓存框架

    如何设计一个图片缓存框架? 方案:首先一个manager 管理者 : 内存管理 磁盘管理 网络codeManage...

  • iOS 图片缓存框架的设计

    图片缓存框架 图片的读写 读取图片image.png 缓存图片image.png (1)如果程序并没有被关闭,一直...

网友评论

      本文标题:自定义图片框架SmartImageView&&图片一级缓存

      本文链接:https://www.haomeiwen.com/subject/rukzoqtx.html