2016-12-04 1 views
0

J'utiliseRx SearchView doit annuler la demande en cours avec moins de priorité

RxSearchView.queryTextChangeEvents

pour détecter les événements de « Recherche As You Type » et également lorsque vous soumettez une recherche , SAYT est d'obtenir des suggestions et quand vous faites un soumettre, il exécute une recherche complète.

J'ai deux problèmes en ce moment. Lorsque vous tapez et obtenez des suggestions, mais que vous cliquez soudainement sur soumettre, la recherche complète est exécutée, mais le problème est que s'il y a une demande de suggestion en cours, il se peut qu'ils apparaissent à l'écran quand ils le devraient. pas comme la recherche complète a la priorité.

Donc je voudrais annuler (désinscription) la demande des suggestions dans le cas où il y a un soumettre sur la recherche complète.

Comment puis-je réaliser cela avec ce code? Un autre problème est que lorsque je supprime le terme de recherche dans la vue de recherche et qu'il est vide, il efface l'adaptateur mais il y a des cas où j'efface le texte de recherche, il y a toujours une demande de suggestions en cours et il Définit les résultats mais il est clair, je voudrais donc garantir que si l'utilisateur efface le searchview, il annule toutes les demandes.

Voici le code que j'utilise.

RxSearchView.queryTextChangeEvents(searchView) 
       .skip(1) 
       .throttleLast(100, TimeUnit.MILLISECONDS) 
       .debounce(200, TimeUnit.MILLISECONDS) 
       .onBackpressureLatest() 
       .observeOn(AndroidSchedulers.mainThread()) 
       .filter(new Func1<SearchViewQueryTextEvent, Boolean>() { 
        @Override 
        public Boolean call(SearchViewQueryTextEvent searchViewQueryTextEvent) { 
         final boolean empty = TextUtils.isEmpty(searchViewQueryTextEvent.queryText()); 
         if (empty) { 
          //Dont show anything clear adapter 
          clearAdapter(); 
         } 
         return !empty; 
        } 
       }) 
       .concatMap(new Func1<SearchViewQueryTextEvent, Observable<Object>>() { 
        @Override 
        public Observable<Object> call(SearchViewQueryTextEvent searchViewQueryTextEvent) { 

         String searchTerm = searchViewQueryTextEvent.queryText().toString(); 
         boolean submitted = searchViewQueryTextEvent.isSubmitted(); 
         //Hide RecyclerView 
         //Show loading indicator 
         showLoading(); 
         Observable<Object> observable; 
         if (submitted) { 
          observable = getFullSearch(searchTerm); 
         } else { 
          observable = getSuggestionsSearch(searchTerm); 
         } 
         return observable 
           .subscribeOn(Schedulers.io()) 
           .observeOn(AndroidSchedulers.mainThread()) 
           .doOnCompleted(new Action0() { 
            @Override 
            public void call() { 
             //Show RecyclerView 
             //Hide loading indicator 
             showContent(); 
            } 
           }); 
        } 
       }) 
       .subscribe(new Subscriber<Object>() { 
        @Override 
        public void onNext(Object object) { 
         //Set data on recyclerview and notify change. 
         setData(object); 
        } 

        @Override 
        public void onCompleted() { 

        } 

        @Override 
        public void onError(Throwable e) { 

        } 

       }); 
    } 

Répondre

2

Vous pouvez essayer à la place switchMap, il utilise juste la dernière valeur emited de l'observable.

De la documentation:

Renvoie une nouvelle Observable en appliquant une fonction que vous fournissez à chaque élément émis par la source Observable qui retourne un Observable, puis émettre les éléments émis par le plus récemment émis des ces Observables. L'observable résultant se termine si l'observable amont et le dernier observable interne, le cas échéant, sont complets. Si l'observable en amont signale une erreur onError, l'observable interne est désinscrit et l'erreur est transmise en séquence.

enter image description here

+0

ont parfaitement fonctionné –

+0

heureux de vous aider! :) – Aballano