如何在Kotlin中通过ImageUrl创建Bitmap?已遇类型不匹配错误
在Kotlin中用Glide通过URL创建Bitmap的正确方式
你遇到的类型不匹配错误,是因为Glide.with(...).asBitmap().load()返回的是请求构建器(RequestBuilder
方案一:同步获取(需在子线程执行)
如果需要同步拿到Bitmap,必须在子线程中操作,避免阻塞主线程引发ANR:
// 借助Coroutine在IO线程执行请求 lifecycleScope.launch(Dispatchers.IO) { try { val bitmap = Glide.with(requireContext()) .asBitmap() .load(imageUrlUri) .submit() // 提交同步请求 .get() // 阻塞当前线程获取Bitmap结果 // 切换回主线程更新UI或使用Bitmap withContext(Dispatchers.Main) { bitMap = bitmap // 这里可以做UI相关操作,比如设置到ImageView } } catch (e: Exception) { e.printStackTrace() // 处理图片加载失败的情况,比如网络错误、链接无效等 } }
方案二:异步监听获取(推荐)
Glide默认是异步加载,通过自定义CustomTarget监听加载结果,无需手动处理线程切换:
Glide.with(requireContext()) .asBitmap() .load(imageUrlUri) .into(object : CustomTarget<Bitmap>() { override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) { // 加载成功,拿到Bitmap对象 bitMap = resource // 这里可以直接更新UI,回调在主线程执行 } override fun onLoadCleared(placeholder: Drawable?) { // 当Glide清除资源时调用,可在此释放Bitmap避免内存泄漏 bitMap?.recycle() bitMap = null } override fun onLoadFailed(errorDrawable: Drawable?) { super.onLoadFailed(errorDrawable) // 加载失败的处理逻辑 } })
注意事项
- 同步方式必须在子线程执行,否则会阻塞主线程
- 使用
CustomTarget时,Glide会自动关联上下文生命周期,减少内存泄漏风险 - 记得处理加载失败的异常情况,提升代码健壮性
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

