学而实习之 不亦乐乎

Android 获取网络图片并转为 Bitmap 格式

2023-08-11 07:01:26

1.初始化绑定视图

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);
}

2.网络请求(核心代码)

方法一 :通过 HttpURLConnection 请求)

/**
 * 通过 网络图片 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); //填充控件
    }
};

(方法二 : 通过 Glide)

/**
 * 获取 网络图片 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) {

        }
    });
}