You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 11:36:02