如何使用ROOM库正确实现SearchView?

问题描述 投票:0回答:1

我希望在利用 ROOM 库的应用程序中实现 SearchView 功能。在我的在线研究过程中,我注意到许多示例和教程都遵循类似于以下的模式:

override fun onQueryTextChange(newText: String?): Boolean {
        if (newText != null) {
            mViewModel.searchAllDatabase(newText).observe(viewLifecycleOwner){
                ...
            }
        }
        return true
    }

但是使用这种方法,每次用户输入新字母时都会创建一个新的观察者,并触发 onQueryTextChange 方法,我猜这可能会导致内存泄漏。 正确的做法是什么?

java android kotlin android-room android-architecture-components
1个回答
0
投票

首先,您应该开始在编辑文本的回调之外/之前观察 - 那么应该没问题,但是......

您尝试做的事情通常是通过流/反应式构造完成的。

因此,不要在每次更改中调用数据库 - 让某些东西监听搜索栏的更改并让其他人监听它。

private val query: MutableStateFlow<String> = MutableStateFlow("")

val searchAllDatabaseData: StateFlow<List<Item> = query.map { newQuery -> searchAllDatabase(newQuery)}

fun updateSearchQuery(query: String) {
    query.value = query
}
© www.soinside.com 2019 - 2024. All rights reserved.