1. 图片网址url转化为bitmap

1.1. 方法一 通过 HttpURLConnection 请求

  要使用一个线程去访问,因为是网络请求,这是一个一步请求,不能直接返回获取,要不然永远为null,在这里得到BitMap之后记得使用Hanlder或者EventBus传回主线程,不过现在加载图片都是用框架了,很少有转化为Bitmap的需求

    /**
     * 通过 网络图片 url 获取图片 Bitmap
     * @param photoUrl 网络图片 url
     */
    private void requestWebPhotoBitmap(String photoUrl) {
        new Thread(() -> {
            HttpURLConnection connection = null;
            try {
                URL bitmapUrl = new URL(photoUrl);
                connection = (HttpURLConnection) bitmapUrl.openConnection();
                connection.setRequestMethod("GET");
                connection.setConnectTimeout(5000);
                connection.setReadTimeout(5000);
 
                // 判断是否请求成功
                if (connection.getResponseCode() == 200) {
                    Message hintMessage = new Message();
                    hintMessage.what = HANDLER_START_DOWNLOAD;
                    hintHandler.sendMessage(hintMessage);
 
                    InputStream inputStream = connection.getInputStream();
                    imgBitmap = BitmapFactory.decodeStream(inputStream);
 
                    Message message = showHandler.obtainMessage();
                    showHandler.sendMessage(message);
                } else {
                    Message hintMessage = new Message();
                    hintMessage.what = HANDLER_NET_ERROR;
                    hintHandler.sendMessage(hintMessage);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (connection != null) connection.disconnect();
            }
        }).start();
    }
    /**
     * 设置提示
     */
    private final Handler hintHandler = new Handler(Looper.getMainLooper()){
        @Override
        public void handleMessage(Message msg) {
            if(msg.what == HANDLER_START_DOWNLOAD)
                Toast.makeText(MainActivity.this, "获取图片中,请稍等", Toast.LENGTH_SHORT).show();
            else if(msg.what == HANDLER_NET_ERROR)
                Toast.makeText(MainActivity.this, "网络错误,请重试", Toast.LENGTH_SHORT).show();
        }
    };
    /**
     * 展示图片
     */
    @SuppressLint("HandlerLeak")
    private final Handler showHandler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            ivPhoto.setImageBitmap(imgBitmap); //填充控件
        }
    };

1.2. 方法二 通过 Glide

1.2.1. java

    /**
     * 获取 网络图片 Bitmap
     * @param imgUrl 网络图片url
     */
    private void requestWebPhotoBitmap(String imgUrl) {
        Toast.makeText(MainActivity.this, "获取图片中,请稍等", Toast.LENGTH_SHORT).show();
        Glide.with(MainActivity.this).asBitmap().load(imgUrl).into(new CustomTarget<Bitmap>() {
            @SuppressLint("ClickableViewAccessibility")
            @Override
            public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
                imgBitmap = resource;
                ivPhoto.setImageBitmap(imgBitmap)
            }
            @Override
            public void onLoadCleared(@Nullable Drawable placeholder) {
 
            }
        });
    }

1.2.2. kotlin

   Glide.with(this).asBitmap()
                    .load(paramBean.userImg).into(object : CustomTarget<Bitmap?>() {
                        override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap?>?) {
                            val bitmap = resource
                        }

                        override fun onLoadCleared(placeholder: Drawable?) {}
                    })

1.3. 调用

    private Bitmap imgBitmap = null;
    private ImageView ivPhoto;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ivPhoto = (ImageView) findViewById(R.id.photo);
        String imgUrl = "https://w.wallhaven.cc/full/l3/wallhaven-l3xk6q.jpg";
        requestWebPhotoBitmap(imgUrl);
    }
03-08 00:32