Kotlin加载Firebase Storage图片速度慢如何优化?
Firebase Storage 图片加载速度优化方案
问题描述
在Android Studio中使用Kotlin开发应用时,实现的Firebase Storage公私图片加载功能可正常运行,但整体加载耗时达20-30秒,需要针对性优化加载速度。
当前采用3列垂直网格布局展示图片,相关实现代码如下:
核心图片列表加载函数
private fun listStoredImages() = CoroutineScope(Dispatchers.IO).launch { try { val userImages = imageRef.child(uid).listAll().await() val publicImages = imageRef.child("UploadedPictures").listAll().await() // 加载用户私有图片 for (image in userImages.items) { val url = image.downloadUrl.await() userImageUrl.add(url.toString()) } // 加载公共图片 for (publicImage in publicImages.items) { val publicUrl = publicImage.downloadUrl.await() userImageUrl.add(publicUrl.toString()) } withContext(Dispatchers.Main) { recyclerView.adapter?.notifyDataSetChanged() } } catch (e: Exception) { withContext(Dispatchers.Main) { Toast.makeText(this@UserCreateAndEditActivity, "加载失败", Toast.LENGTH_SHORT).show() } } }
Storage引用声明
val imageRef = Firebase.storage.reference
RecyclerView初始化代码
private var gridLayoutManager: GridLayoutManager? = null // onCreate生命周期内初始化 gridLayoutManager = GridLayoutManager(applicationContext, 3, LinearLayoutManager.VERTICAL, false) recyclerView.setHasFixedSize(true) imageAdapter = ImageAdapter(this, userImageUrl) recyclerView.layoutManager = gridLayoutManager recyclerView.adapter = imageAdapter
具体优化方案
- 并行获取下载链接,替换串行请求逻辑
现有实现通过for循环逐个await()下载链接,属于串行排队请求,图片数量越多总耗时越长。可以将批量下载链接的请求改为并行发起,通过协程的awaitAll()一次性等待所有请求返回,总耗时从「单请求耗时*图片数量」降低到「单请求耗时」级别。示例修改逻辑:// 并行获取所有私有图片链接 val privateUrls = userImages.items.map { it.downloadUrl }.awaitAll().map { it.toString() } // 并行获取所有公共图片链接 val publicUrls = publicImages.items.map { it.downloadUrl }.awaitAll().map { it.toString() } userImageUrl.addAll(privateUrls + publicUrls) - 分批次刷新UI,避免长时间白屏
现有实现需要等所有公私图片的链接全部请求完成才刷新列表,用户需要等待几十秒才能看到内容。可以调整为分批加载:先请求私有图片链接,拿到后立刻刷新列表展示,同时后台继续请求公共图片链接,每拿到一部分就追加到列表并刷新,大幅降低用户感知等待时长。 - 使用专业图片加载库,避免加载原图浪费资源
3列网格的单张图片展示尺寸很小,如果直接加载原图(单张可能几MB),会浪费大量带宽和加载时间。接入Coil/Glide这类图片加载库,开启以下配置:- 自动根据ImageView尺寸采样加载对应分辨率的图片,不加载全尺寸原图
- 开启内存+磁盘二级缓存,二次进入页面直接读本地缓存不需要重新请求网络
- 配置列表滚动时暂停加载非可视区域图片,停止滚动后再恢复加载,避免带宽抢占
- 优化存储侧资源配置
图片上传时就提前生成适配列表页尺寸的缩略图存入Storage,列表页直接加载缩略图链接,用户点击查看详情时再加载原图;有条件可以为Storage配置CDN加速,通过就近节点返回资源进一步降低网络耗时。同时可以将拉取过的图片列表元数据、URL缓存到本地,进入页面先加载本地缓存内容做到秒开,后台再拉取最新数据更新。 - 优化RecyclerView刷新逻辑
现有实现每次更新都调用notifyDataSetChanged()全量刷新,效率低且无动画。后续列表更新替换为DiffUtil计算新旧列表差异,做定向item刷新,减少不必要的UI重绘开销;同时可以配置RecyclerView预加载参数,提前加载即将进入可视区域的图片,滑动时更流畅。
内容的提问来源于stack exchange,提问作者Noccis
相关产品推荐
相关产品推荐

