我希望在利用 ROOM 库的应用程序中实现 SearchView 功能。在我的在线研究过程中,我注意到许多示例和教程都遵循类似于以下的模式:
override fun onQueryTextChange(newText: String?): Boolean {
if (newText != null) {
mViewModel.searchAllDatabase(newText).observe(viewLifecycleOwner){
...
}
}
return true
}
但是使用这种方法,每次用户输入新字母时都会创建一个新的观察者,并触发 onQueryTextChange 方法,我猜这可能会导致内存泄漏。 正确的做法是什么?
首先,您应该开始在编辑文本的回调之外/之前观察 - 那么应该没问题,但是......
您尝试做的事情通常是通过流/反应式构造完成的。
因此,不要在每次更改中调用数据库 - 让某些东西监听搜索栏的更改并让其他人监听它。
private val query: MutableStateFlow<String> = MutableStateFlow("")
val searchAllDatabaseData: StateFlow<List<Item> = query.map { newQuery -> searchAllDatabase(newQuery)}
fun updateSearchQuery(query: String) {
query.value = query
}