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()
}
Entprellung: Hier wird der Entprellungsoperator mit einer Zeitkonstanten verwendet. Der Entprellungsoperator behandelt den Fall, dass der Benutzer in sehr kurzer Zeit „a“, „ab“, „abc“ eingibt. Es wird also zu viele Netzwerkanrufe geben. Doch schließlich interessiert den Nutzer das Ergebnis der Suche „abc“. Sie müssen also die Ergebnisse von „a“ und „ab“ verwerfen. Idealerweise sollte es keine Netzwerkaufrufe für „a“ und „ab“ geben, da der Benutzer diese in sehr kurzer Zeit eingegeben hat. Der Entprellungsoperator kommt also zur Rettung. Der Entpreller wartet die angegebene Zeit ab, um etwas zu unternehmen. Wenn zwischen dieser Zeit eine andere Suchanfrage eintrifft, wird das vorherige Element ignoriert und mit der neuen Suchanfrage erneut auf diese Zeit gewartet. Wenn in der vorgegebenen konstanten Zeit nichts Neues eintrifft, wird mit dieser Suchanfrage zur weiteren Verarbeitung fortgefahren. Entprellen gibt also nur dann ein Element von einem Observable aus, wenn eine bestimmte Zeitspanne verstrichen ist, ohne dass ein anderes Element ausgegeben wurde.
Filter: Der Filteroperator wird verwendet, um die unerwünschte Zeichenfolge wie in diesem Fall eine leere Zeichenfolge zu filtern, um unnötige Netzwerkaufrufe zu vermeiden.
DistinctUntilChanged: Der Operator „distinctUntilChanged“ wird verwendet, um doppelte Netzwerkaufrufe zu vermeiden. Nehmen wir an, die letzte laufende Suchanfrage war „abc“ und der Benutzer hat „c“ gelöscht und erneut „c“ eingegeben. Es ist also wieder „abc“. Wenn also der Netzwerkanruf bereits mit der Suchabfrage „abc“ läuft, wird der doppelte Anruf nicht erneut mit der Suchabfrage „abc“ durchgeführt. DistinctUntilChanged unterdrückt also doppelte aufeinanderfolgende Elemente, die vom Quell-Observable ausgegeben werden.
flatMapLatest: Hier wird der switchMap-Operator verwendet, um Netzwerkaufrufergebnisse zu vermeiden, die für die Anzeige für den Benutzer nicht mehr benötigt werden. Nehmen wir an, die letzte Suchanfrage war „ab“, und es gibt einen laufenden Netzwerkaufruf für „ab“, und der Benutzer hat „abc“ eingegeben. Dann interessiert Sie das Ergebnis von „ab“ nicht mehr. Sie interessieren sich nur für das Ergebnis von „abc“. Hier kommt die switchMap zur Rettung. Es liefert nur das Ergebnis für die letzte Suchanfrage (die aktuellste) und ignoriert den Rest.
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.