所以我有一个带有分页适配器的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内置了离线缓存系统,即使互联网暂时不可用,这种逻辑也能工作。。。