我正在使用 Person 对象来构建 Gmail 等聊天应用程序通知。所以我创建了 person 对象。但我想从来自服务器的图像 URL 设置图标,而不是来自可绘制资源。我正在使用 Coil 库来加载图像。下面的代码工作正常,
默认情况下,android 会生成图标,并将第一个字母传递给标题。 那么,我如何将来自服务器的图像显示为图标中的 URL,并具有内存和资源使用的最佳实践。下面是我的 Person 对象。 这是Person的官方链接。 这就是我提到的通知消息风格教程
val senderPerson: Person = Person.Builder().also {person->
person.setKey(message.getSenderKey(prefs))
person.setName(message.getNotificationTitle())
person.setImportant(true)
//****HERE I WANT TO SET IMAGE FROM URL******
// person.setIcon(IconCompat.createWithResource(this, R.drawable.placeholder_transaparent))
}.build()
您可以使用 Coil Request 异步加载图像 URL,并在闭包中返回获取的图标。
Coil 返回一个可绘制对象,您可以使用
Drawable
通过位图从 IconCompat.createWithBitmap((drawable as BitmapDrawable).bitmap)
获取图标:
private fun asyncLoadIcon(imageUrl: String?, setIcon: (IconCompat?) -> Unit) {
if (imageUrl.isNullOrEmpty())
setIcon(null)
else {
// using COIL to load the image
val request = ImageRequest.Builder(this)
.data(imageUrl)
.target { drawable ->
setIcon(IconCompat.createWithBitmap((drawable as BitmapDrawable).bitmap)) // // Return the fetched icon from the URL
}
.listener(object : ImageRequest.Listener { // Return null icon if the URL is wrong
override fun onError(request: ImageRequest, result: ErrorResult) {
setIcon(null)
}
})
.build()
imageLoader.enqueue(request)
}
}
如果 URL 错误或为空/空,此代码将返回空图标。
然后使用该函数构建通知消息:
asyncLoadIcon("https://my_icon_url.png") { // set the icon url
val person = Person.Builder().apply {
setName("John Doe")
setIcon(it)
}.build()
// Build the notification with the person
.....
}
对于某些增强功能,您可以启用缓存并禁用硬件位图;但我确实推荐其他库,例如 Glide 和 Picasso。
.memoryCachePolicy(CachePolicy.ENABLED)
.diskCachePolicy(CachePolicy.ENABLED)
.allowHardware(false) // Disable hardware bitmaps
这是使用 Kotlin 协程的另一种方法。我们可以将 Coil 的异步调用转换为可挂起的函数。
val person = Person.Builder().apply {
setName(name)
getPersonIcon(imageUrl)?.let { setIcon(it) }
}.build()
private suspend fun getPersonIcon(
imageUrl: String
): IconCompat? = suspendCoroutine { continuation ->
val request = ImageRequest.Builder(context)
.data(imageUrl)
.target { drawable ->
continuation.resume(
IconCompat.createWithBitmap((drawable as BitmapDrawable).bitmap)
)
}
.listener(object : ImageRequest.Listener {
override fun onError(request: ImageRequest, result: ErrorResult) {
continuation.resume(null)
}
})
.build()
Coil.imageLoader(context).enqueue(request)
}