class SearchViewModel ( searchRepository : SearchRepository ) : ViewModel() {
val query = MutableLiveData < String >()
@FlowPreview
@ExperimentalCoroutinesApi
val repo = query.asFlow()
.debounce( 300 )
.filter {
it.trim().isEmpty(). not ()
}
.distinctUntilChanged()
.flatMapLatest {
searchRepository.searchRepo(it).asFlow()
}.asLiveData()
}
Debounce:这里,debounce 运算符与时间常数一起使用。去抖动运算符处理用户在很短的时间内输入“a”、“ab”、“abc”的情况。所以会出现过多的网络调用。但用户最终对搜索“abc”的结果感兴趣。因此,您必须丢弃“a”和“ab”的结果。理想情况下,当用户在很短的时间内键入“a”和“ab”时,不应该有网络调用。因此,去抖操作符就来救援了。反跳将等待提供的时间来执行任何操作,如果在该时间之间出现任何其他搜索查询,它将忽略前一个项目并开始再次等待新搜索查询的时间。如果在给定的恒定时间内没有出现任何新内容,它将继续执行该搜索查询以进行进一步处理。因此,debounce 仅在特定时间跨度过去且未发出另一个项目的情况下从 Observable 发出一个项目。
过滤器:过滤器运算符用于过滤不需要的字符串,例如本例中的空字符串,以避免不必要的网络调用。
DistinctUntilChanged: distinctUntilChanged 运算符用于避免重复的网络调用。假设最后一个正在进行的搜索查询是“abc”,用户删除了“c”并再次键入“c”。所以又是“abc”。因此,如果网络调用已经在使用搜索查询“abc”进行,则不会再次使用搜索查询“abc”进行重复调用。因此,distinctUntilChanged 会抑制源 Observable 发出的重复的连续项。
flatMapLatest:这里使用 switchMap 运算符来避免不需要更多向用户显示的网络调用结果。假设最后一个搜索查询是“ab”,并且正在进行“ab”的网络调用,并且用户输入了“abc”。那么你对“ab”的结果不再感兴趣。您只对“abc”的结果感兴趣。因此,switchMap 来救援。它仅提供最后一个搜索查询(最近)的结果并忽略其余部分。
Copyright 2019 Hari Singh Kulhari
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.