2016-11-30 1 views
1

comment utiliser RxJava Fonction .filter() pour condition particulière, je veux juste seules les données id est de 168, ce est bonne façon de faire ou d'avoir à changer mon code le style donnez-moi votre suggestion valable. (Sans RetroLambda utilisation :))RX + Retrofit données du serveur filtring Réponse

NetworkRequest networkRequest = new NetworkRequest(this); 
RestApi api = networkRequest.getInstance().create(RestApi.class); 

    subscription = api 
      .school() 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Subscriber<Response<SchoolList>>() { 
       @Override 
       public void onCompleted() { 
        Log.d(TAG, "onCompleted: completed"); 
       } 

       @Override 
       public void onError(Throwable e) { 
        Log.d(TAG, "onError: on Error"); 
        e.printStackTrace(); 
       } 

       @Override 
       public void onNext(Response<SchoolList> schoolResponse) { 

        Log.d(TAG, "onNext: " + schoolResponse.getSchoolList().size()); 
       } 
      }); 

j'ai réponse comme

{ "schoolList": [ 
{ 
    "name": "A University", 

    "id": "168" 
}, 
{ 
    "name": "Alba Sciences", 
    "id": "271" 
}, 
{ 
    "name": "B University", 

    "id": "168" 
}] 
} 

j'ai essayer cette façon, mais faire remarquer dans (sur Suivant)

NetworkRequest networkRequest = new NetworkRequest(this); 
RestApi api = networkRequest.getInstance().create(RestApi.class); 

    subscription = api 
      .school() 
      .filter(new Func1<Response<SchoolList>, Boolean>() { 
       @Override 
       public Boolean call(Response<SchoolList> schoolListResponse) { 
        Log.d(TAG, "condition: computing 2"); 
        return schoolListResponse.getSchoolList().get(0).getId().equals("168"); 
       } 
      }) 
      .subscribeOn(Schedulers.computation()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Subscriber<Response<SchoolList>>() { 
       @Override 
       public void onCompleted() { 
        Log.d(TAG, "onCompleted: completed"); 
       } 

       @Override 
       public void onError(Throwable e) { 
        Log.d(TAG, "onError: on Error"); 
        e.printStackTrace(); 
       } 

       @Override 
       public void onNext(Response<SchoolList> schoolResponse) { 

        Log.d(TAG, "onNext: " + schoolResponse.getSchoolList().size()); 
       } 
      }); 
+0

check ma [réponse] (http : //stackoverflow.com/a/40887006/3629732) –

Répondre

0

Je pense que vous devriez pouvoir t o utiliser quelque chose comme suit (recommandons fortement l'utilisation RetroLambda (ou Jack quand il est prêt) lors de l'utilisation RxJava)

api.school() 
      .flatMapIterable(schoolResponse -> schoolResponse.getSchoolList()) 
      .filter(school -> school.getId().equals("168")) 
      .toList() 
+0

Merci Johan pour votre réponse rapide, ouais j'ai lu à ce sujet, travaillant sur RetroLambda, mais en ce moment j'ai un scénario comme celui que j'ai décrit dans ma question. – Drim

+0

l'exemple que j'ai donné ci-dessus devrait encore fonctionner pour le problème que vous avez décrit sans l'utilisation de RetroLambda .... qui le rend juste plus joli :) –

+0

ouais il fait, merci, avez-vous un exemple pour Retrolambda et Rx java mélanger celui-ci est un peu tordu pour le nouvel apprenant – Drim

0

Voir avec FlatMap opérateur schoolItem votre élément sélectionné

api.school().flatMap(new Func1<SchoolListResponse, Observable<SchoolItem>>() { 
     @Override 
     public Observable<SchoolItem> call(SchoolListResponse schoolListResponse) { 
      return Observable.from(schoolListResponse.getSchoolList()); 
     } 
    }).filter(new Func1<SchoolItem, Boolean>() { 
     @Override 
     public Boolean call(SchoolItem schoolItem) { 
      return schoolItem.getId().equals("168"); 
     } 
    }).subscribe(new Subscriber<SchoolItem>() { 
     @Override 
     public void onCompleted() { 

     } 

     @Override 
     public void onError(Throwable e) { 
      e.printStackTrace(); 
     } 

     @Override 
     public void onNext(SchoolItem schoolItem) { 
      //schoolItem Filtered Item 
     } 
    }); 
+0

Thanx pour la réponse, pour une solution rapide i passer à RetroLambda, Désolé n'a pas pu tester celui-ci je vais tester celui-ci plus tard, – Drim

+0

@Drim Ok Choice est à vous –