使用位图类型转换器 class 时从 ROOM 数据库多次查询行会使应用程序崩溃

Querying rows multiple times from ROOM database while using a Bitmap Type Converter class is crashing the App

所以我有带分页适配器的 Recycler View,recycler 视图列表项有一个 imageView 和几个文本视图。适配器正在从另一个 ROOM 数据库中检索 textView 的数据,而每个特定列表项的图像正在从另一个 ImageHolder ROOM 数据库中检索。

在适配器的 onBind 方法中,除了绑定 textViews 之外,还有一个单独调用 ImageHolder ROOM 数据库以获取关联图像。 Recycler View 有大约 100 个项目,当 UI 快速滚动时,对 ImageHolder 数据库进行了大约 100 次查询。这工作正常,但当用户滚动并使应用程序崩溃时,它会减慢应用程序的速度。我该如何避免崩溃?

代码如下:

数据class

@Entity(tableName = IMAGE_HOLDER_TABLE)
data class ImageHolder(

    @PrimaryKey(autoGenerate = false)
    var contentId: String = "",
    var imageBitmap : Bitmap,  // I am using a Converter class to convert a Bitmap to a ByteArray
    var timeStamp : Long = System.currentTimeMillis()
)

Dao 接口

@Dao
interface ImageHolderDatabaseDao {

    @Query("SELECT * FROM $IMAGE_HOLDER_TABLE WHERE contentId = :contentId")
    suspend fun getImageHolder(contentId : String): ImageHolder

    @Query("SELECT imageBitmap FROM $IMAGE_HOLDER_TABLE WHERE contentId = 
    :contentId")
    suspend fun getImage(contentId : String): Bitmap
}

在Adapter的onBindViewHolder方法中获取图片的方法

val imageHolderDatabase = ImageHolderDatabase.instance(getApplicationContext())
    val imageHolderDatabaseDao = imageHolderDatabase.databaseDao
    private val scope = CoroutineScope(Dispatchers.Main +  
CoroutineName("notificationsAdapterCoroutine"))

    private fun populatePhotoFromLocalDb(senderUserId : String) {
        scope.launch {
            val imageBitmap = imageHolderDatabase.withTransaction {
                imageHolderDatabaseDao.getImageHolder(senderUserId)
            }

            Glide.with(getApplicationContext())
                .load(imageBitmap.imageBitmap)
                .placeholder(R.drawable.black_color_rectangle)
                .apply(glideRequestOptionsForCache)
                .transition(DrawableTransitionOptions.withCrossFade(glideCrossFadeDuration))
                .listener(glideFinishedLoadingListener(senderUserId, true, null))
                .into(binding.image)
        }
    }
//I am using the Paging 3 adapter to populate the textViews from another Room Database

我意识到对 ImageHolder Room 数据库进行了 100 次查询调用,因为 Recycler View 中有 100 个项目。我正在使用 Glide 但暂时没有使用它的缓存。

执行此操作的内存高效方法是什么?

从 ByteArray 到 Bitmap 的类型转换器导致过多的内存使用,这实际上是一种存储图像的好方法,但是使用方便的 ROOM 类型转换器的错误用例(除非它用于非 recyclerView 适配器), 我改变了逻辑,只在 Room Db 中存储下载 Urls 并使用 glide 通过下载 Url 加载图像,因为 glide 内置了离线缓存系统,这个逻辑甚至可以工作暂时无法上网...