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



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

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

这是代码:

数据类

@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

我意识到有100个查询调用到ImageHolder房间数据库,因为Recycler视图中有100个项目。我正在使用Glide,但目前没有使用它的缓存。

什么是有效记忆的方法?

从ByteArray到Bitmap的类型转换器导致了太多的内存使用,这实际上是存储图像的好方法,但使用ROOM的方便类型转换器是错误的用例(除非它用于非循环视图适配器(,相反,我改变了逻辑,只将下载Url存储在Room Db中,并使用glide通过下载Url加载图像,因为glide内置了离线缓存系统,即使互联网暂时不可用,这种逻辑也能工作。。。

最新更新