Android Kotlin 使用Glide下载图片为Bitmap存变量适配通知栏问题求解
问题原因
你现有代码的问题主要有3个:
- 直接调用
submit().get()是阻塞API,若在主线程执行会直接抛出NetworkOnMainThreadException异常 RequestListener泛型不匹配:使用asBitmap()加载时,RequestListener的泛型应为Bitmap,你代码中target参数写为Target<Drawable>,会直接触发编译错误- 逻辑不符合异步场景:通知设置大图标不需要同步等待图片加载完成,可以先显示带占位图的通知,加载完成后再更新通知即可
推荐解决方案(异步加载,无需阻塞线程)
Glide的CustomTarget可以直接接收异步加载的Bitmap结果,无需主动阻塞拿取,适配通知更新场景:
// 1. 初始化占位Bitmap,先构建并显示带占位图的通知 val placeholderBitmap = BitmapFactory.decodeResource(this@MainActivity.resources, R.drawable.notif_smiley) val notificationId = 1001 // 自定义通知唯一ID val channelId = "your_channel_id" // 替换为你自己的通知通道ID val notificationBuilder = NotificationCompat.Builder(this@MainActivity, channelId) .setSmallIcon(R.drawable.your_small_icon) // 通知必须设置小图标,替换为你自己的资源 .setContentTitle("通知标题") .setContentText("通知内容") .setLargeIcon(placeholderBitmap) .setPriority(NotificationCompat.PRIORITY_DEFAULT) NotificationManagerCompat.from(this@MainActivity).notify(notificationId, notificationBuilder.build()) // 2. Glide异步加载网络图片,加载完成后更新通知 Glide.with(this@MainActivity) .asBitmap() .load(imgurl) .skipMemoryCache(true) .diskCacheStrategy(DiskCacheStrategy.NONE) .override(256, 256) // 通知图标不需要过高分辨率,固定尺寸可避免内存浪费 .into(object : CustomTarget<Bitmap>() { override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) { // 加载成功,更新通知大图标 notificationBuilder.setLargeIcon(resource) NotificationManagerCompat.from(this@MainActivity).notify(notificationId, notificationBuilder.build()) // 测试用ImageView赋值 binding.contentMain.testingGlide.setImageBitmap(resource) } override fun onLoadCleared(placeholder: Drawable?) { // 资源回收回调,普通场景无需额外处理 } override fun onLoadFailed(errorDrawable: Drawable?) { // 加载失败,保持原有占位图即可,无需额外操作 } })
若必须同步获取Bitmap(不推荐)
同步方法必须放在子线程执行,禁止在主线程调用:
thread { var bitmap = BitmapFactory.decodeResource(this@MainActivity.resources, R.drawable.notif_smiley) try { bitmap = Glide.with(this@MainActivity) .asBitmap() .load(imgurl) .skipMemoryCache(true) .diskCacheStrategy(DiskCacheStrategy.NONE) .override(256, 256) .submit() .get() } catch (e: Exception) { e.printStackTrace() } // 切回主线程更新UI和通知 runOnUiThread { notificationBuilder.setLargeIcon(bitmap) NotificationManagerCompat.from(this@MainActivity).notify(notificationId, notificationBuilder.build()) binding.contentMain.testingGlide.setImageBitmap(bitmap) } }
内容的提问来源于stack exchange,提问作者user17027702
相关产品推荐
相关产品推荐

