2016-05-16 6 views
3

Ich habe so JSON:Richtiger Weg RxJava + Nachrüstung mit 2

{ 
"success":true, 
"data":[ 
    { 
     "id":"29", 
    "name":"\u0420\u0435\u0441\u0442\u043e\u0440\u0430\u0446\u0456\u044f \u0411\u0430\u0447\u0435\u0432\u0441\u044c\u043a\u0438\u0445 \/ Baczewski Restaurant", 
    "street":"\u0432\u0443\u043b. \u0428\u0435\u0432\u0441\u044c\u043a\u0430, 8", 
    "latitude":"49.842292845502", 
    "longitude":"24.029848249565", 
    "image":"https:\/\/i.onthe.io\/j9aocq72r2lfsmoh9.r500x500.01ff9fff.jpg" 
    }, 
    ... 
    ] 
    } 

Nach ihr zu Classes (pojo) mit Schema pojo erstellt hat. Erste stellt Verfahren Daten aus data Array zu erhalten ->

public List<Datum> getData() { 
    return data; 
} 

Und das zweite ist ein model dieser Daten.

Während ich eine call ausführen mit nur 2,0 nachzurüsten, jede object vom data Array analysieren und fügen Sie für mich RecyclerView.Adapter

Call<PlaceList> call = service.list(1, offset, 10); 
call.enqueue(new Callback<PlaceList>() { 
     @Override 
     public void onResponse(Call<PlaceList> call, Response<PlaceList> response) { 
      final int size = response.body().getData().size(); 
      for (int i = 0; i < size; i++) { 
       places.add(response.body().getData().get(i)); 
      } 
      handler.post(new Runnable() { 
       @Override 
       public void run() { 
        if (offset == 0) 
         // adapter.notifyItemRangeInserted(0, foodDataList.size()); 
         placeRecyclerAdapter.notifyDataSetChanged(); 
        else 
         placeRecyclerAdapter.notifyItemRangeChanged(places.size() - size, places.size()); 
       } 
      }); 

     } 

     @Override 
     public void onFailure(Call<PlaceList> call, Throwable t) { 

     } 
    }); 
    _______________ 

    public interface Places { 
@GET("places.getPlaces") 
Call<PlaceList> list(
     @Query("type") int type, 
     @Query("offset") int offset, 
     @Query("limit") int limit); 
     } 

dieser So eine übliche Art und Weise. Jetzt möchte ich dasselbe mit RxJava machen.

Hier ist meine interface:

public interface Places { 
@GET("places.getPlaces") 
Observable<PlaceList> list(@Query("type") int type, 
          @Query("offset") int offset, 
          @Query("limit") int limit); 
} 

Und das ist, wie ich call ausführen:

Observable<PlaceList> call = service.list(1, offset, 10); 
    subscription = call.subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<PlaceList>() { 
       @Override 
       public void onCompleted() { 
        System.out.println("onComplete"); 
       } 

       @Override 
       public void onError(Throwable e) { 
        System.out.println("onError"); 
        e.printStackTrace(); 
       } 

       @Override 
       public void onNext(PlaceList data) { 
        placeRecyclerAdapter.addData(data.getData()); 
       } 
      }); 

Ja, es funktioniert auch, aber war es eine richtige Art und Weise Rx zu verwenden? Ich habe versucht, die für das Parsen benötigte Zeit zu vergleichen, konnte aber keinen nennenswerten Unterschied feststellen. Ich bin gerade an meinem ersten Tag des Studiums RxJava, nachdem ich einige Artikel gelesen habe. Also, was ist der richtige Weg, um die Kraft von RxJava zu fühlen?

+0

Das ist in Ordnung. Die wahre Stärke von RxJava kommt jedoch, wenn Sie Daten abrufen, in der Datenbank speichern und dann einen weiteren Netzwerkaufruf für eine bestimmte Teilmenge der Ergebnisse durchführen möchten usw. – Jahnold

Antwort

0

Sie verwenden es richtig, RxJava hat sehr viel Macht, die Sie nutzen können, um die Leistung zu verbessern.

Wo zu verwenden? 1. Auf Benutzerereignisse, wie Schaltfläche klicken, Schlüsselereignisse 2. Reagieren auf Latenz gebunden IO. Disk/Netzwerk lesen/schreiben 3. Von Hardware/Sensoren ausgelöste Ereignisse

Sollte Thread nicht manuell von Observable create starten.

Retrofit Netzanruf mit RxJava: Verwendung Single: Da unsere API keine Daten in einem Stück oder mehrfach geben. Stattdessen wird alles in nur einem Anruf ausgegeben. Also, im Falle von Observable onCompleted() wird folgen, sobald OnNext() passiert. So wäre es besser, Single für API-Aufruf zu verwenden.

Verwenden Sie Completable: Immer wenn wir nur Daten über API auf Server aktualisieren müssen, und wir kümmern uns nicht darum, was das Ergebnis sein sollte. Wir meinten nur, wenn der Service erfolgreich ist oder nicht. In diesen Fällen erwarten wir nichts auszustoßen. Daher wird die Verwendung von Completable in den Fällen empfohlen.

Für Fortschritt Ansicht hide/show: Bind diese beiden Ereignisse mit doOnSubscribe() und doFinally(). Dies sind zwei Operatoren, so dass wir sie logisch mit RxCall binden können.

RxJava Fehlerbehandlung:

onErrorResumeNext() - weist eine beobachtbare eine Sequenz von Elementen zu emittieren (die ein weiteres beobachtbar ist), wenn es einen Fehler

onErrorReturn() trifft - weist ein Observable an, ein bestimmtes Element auszugeben, wenn ein Fehler auftritt

onExceptionResumeNext() - weist eine beobachtbare emittierende Elemente fortzusetzen, nachdem er eine Ausnahme (aber nicht eine andere Vielzahl von throwable) trifft

Wiederholungs() - wenn eine Quelle einen Fehler beobachtbare emittiert, um es in der Hoffnung resubscribe, dass es abgeschlossen wird, ohne Error. Hier können wir auch das Argument übergeben, wie oft ein erneuter Versuch stattfinden soll. Wie. Wiederholen (4). Es wird vier Mal wiederholt und wenn danach erneut ein Fehler auftritt, wird ein Fehler ausgelöst.

retryWhen() - wenn eine Quelle einen Fehler beobachtbare abgibt, passieren, dass Fehler auf eine andere beobachtbare zu bestimmen, ob an der Quelle

RxAndroid für View-Bindung an resubscribe:

Denken Reactive : Wir können RxJava für alle Ansichtsereignisse einschließlich Klickereignis, Bildlaufereignis, Ziehereignis verwenden. Kurz gesagt, können wir alle Listener durch RxJava-Observablen ersetzen.

verfügbaren Bibliotheken auf Ansicht Ebene zu verwenden: RxBinding, RxSupport-v4, RxAppCompat-v7, RxRecyclerView, RxDesign, RxLeanBack.

RxBinding mit MVP: Wir werden Observable von View zurückgeben. Dieses Observable wird zu Presenter geholt und wird Subscription bei Presenter machen.

RxAdapter: wir können dies für Datenänderung Ereignis in Adapter verwenden. In der Regel für Android Listview verfügbar. RxRecyclerView: Für recycleerview adapter Datenänderungsereignisse können wir dies verwenden.