#android #android-notifications #android-glide #android-bubbles
#Android #android-уведомления #android-glide #android-пузырьки
Вопрос:
Как использовать кэш Glide для загрузки значков уведомлений? Это IconCompat, используемый в объекте Person в уведомлениях и ярлыках MessagingStyle. Кроме того, пузырьки требуют использования обоих из них.
Я использовал Glid в качестве парового:
private IconCompat loadIcon(String url) throws ExecutionException, InterruptedException {
RequestOptions requestOptions = new RequestOptions().override(ADAPTIVE_BITMAP_SIZE);
Bitmap bitmap = Glide.with(G.app).asBitmap().apply(requestOptions).load(url).submit().get();
return IconCompat.createWithAdaptiveBitmap(bitmap);
}
У меня есть несколько вопросов об этом решении
- Какой должен быть размер
ADAPTIVE_BITMAP_SIZE
? - Когда растровое изображение будет переработано?
- Как обрабатывать ошибки при загрузке растрового изображения?
Ответ №1:
Создайте пользовательский TargetWrapper
значок для асинхронной загрузки. Настройте свой Glide, используя ваш экземпляр TargetWrapper.
asyncLoadIcon("http://YOUR_URL.com"){
val person = Person.Builder()
.setName("John Doe")
.setIcon(it)
notificationManagerHelper.notify(
person.build()
)
}
Вспомогательная функция для асинхронной загрузки растрового изображения затем переносится в значок
private fun asyncLoadIcon(avatar: String?, block: (IconCompat?) -> Unit) {
if (avatar.isNullOrEmpty())
block(null)
else {
GlideHelper.createWithAdaptiveBitmap(requireContext(), avatar) { result ->
if (result?.isSuccess() == true)
block(IconCompat.createWithAdaptiveBitmap(result.toData()))
else block(null)
}
}
}
Вот функция запроса изображения Glide с получением растрового изображения с обратным вызовом.
fun createWithAdaptiveBitmap(
context: Context,
url: String,
listener: ((Result<Bitmap>?) -> Unit)
) {
val options = RequestOptions()
.diskCacheStrategy(DiskCacheStrategy.DATA)
.override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
.dontTransform()
Glide.with(context)
.asBitmap()
.apply(options)
.load(url)
.into(CustomTargetWrapper(listener))
}
Класс CustomTargetWrapper для асинхронной загрузки растрового изображения.
class CustomTargetWrapper(
private val listener: ((Result<Bitmap>?) -> Unit)
) : CustomTarget<Bitmap>() {
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
listener.invoke(Result.Success(resource))
}
override fun onLoadCleared(placeholder: Drawable?) {
listener.invoke(null)
}
override fun onLoadFailed(errorDrawable: Drawable?) {
super.onLoadFailed(errorDrawable)
listener.invoke(Result.Error(IOException("Glide load failed")))
}
}