在没有第三方的情况下从 Url 加载图像

Load image from Url without third-party

我正在尝试使用以下代码从 URL 加载图像:

@BindingAdapter("imageUrl")
fun ImageView.bindImage(imgUrl: String?) {

    imgUrl?.let {
        val imgUri = imgUrl.toUri().buildUpon().scheme("https").build().toString()
        val executor = Executors.newSingleThreadExecutor()
        val handler = Handler(Looper.getMainLooper())
        var image: Bitmap?
        executor.execute {
            try {
                val `in` = URL(imgUri).openStream()
                image = BitmapFactory.decodeStream(`in`)

                handler.post {
                    this.setImageBitmap(image)
                    executor.shutdown()
                }
            } catch (e: Exception) {
                Log.e("Tag", "onCreate: ${e.message}")
            }
        }
    }
}

这是 xml

 <androidx.appcompat.widget.AppCompatImageView
                android:id="@+id/iv_album_image"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scaleType="centerCrop"
                app:imageUrl="@{albumsObject.albumImage}"
                android:src="@drawable/img_album_cover" />

它工作正常..但有问题 1- 当我 运行 笔记本电脑正在升温并且风扇变得非常响亮时 2- 如果我在回收商列表上滚动查看图像绑定缓慢我可以在即将发布的照片​​上看到上一张照片

这段代码有问题吗?或者有人有另一种方法可以在不使用任何第三方的情况下从 URL 加载图像.. 只需 Android SDK

试试这个

fun ImageView.loadImage(url: String?){
    val policy = StrictMode.ThreadPolicy.Builder().permitAll().build()
    StrictMode.setThreadPolicy(policy)
    val bitmap: Bitmap?
    val inputStream: InputStream
    try {
        inputStream = URL(url).openStream()
        bitmap = BitmapFactory.decodeStream(inputStream)
    } catch (e: IOException) {
        e.printStackTrace()
        return
    }
    this.setImageBitmap(bitmap)
}

我用这段代码解决了它:

@BindingAdapter("imageUrl")
fun ImageView.bindImage(imgUrl: String?) {

    if(this.drawable == null) {

        imgUrl?.let {
            val imgUri = imgUrl.toUri().buildUpon().scheme("https").build().toString()


            val uiHandler = Handler(Looper.getMainLooper())
            thread(start = true) {
                val bitmap = downloadBitmap(imgUri)
                uiHandler.post {
                    this.setImageBitmap(bitmap)
                }
            }
        }
    }

}

fun downloadBitmap(imageUrl: String): Bitmap? {
    return try {
        val conn = URL(imageUrl).openConnection()
        conn.connect()
        val inputStream = conn.getInputStream()
        val bitmap = BitmapFactory.decodeStream(inputStream)
        inputStream.close()
        bitmap
    } catch (e: Exception) {
        Log.e(ContentValues.TAG, "Exception $e")
        null
    }
}
  1. 检查是否未加载,避免加载多个
  2. 将 HTTPS 添加到 URL。
  3. 创建线程以打开输入流连接并获取图像位图。
  4. 为主线程创建一个处理程序 return 并设置图像位图。