2016-07-17 459 views
13

Ho cercato le documentazioni di RxJava1 https://github.com/ReactiveX/RxJava/releases e RxJava2 https://github.com/ReactiveX/RxJava/wiki/Reactive-Streams e sembra che l'unica differenza sia che RxJava 2 ha Java Stream.Differenze tra RxJava1 e RxJava2

Qualsiasi altro diverso ?.

ho lavorato con la versione 1.1.3, ma non sono sicuro se ne vale la pena passare a RxJava2 dal momento che stiamo già utilizzando Java 8 flussi nel nostro codice

saluti.

+2

direi che l'unica differenza è che usa le nuove [Java Streams API] (https: // docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html) che è stato introdotto in Java 8. – Andreas

+0

Quindi avere Java 8 qual è il punto? Differisce il flusso Java 8 e il flusso rxjava 2? – paul

+1

Hai persino letto il secondo link che hai fornito? * "RxJava 1.x non implementa direttamente le API Reactive Streams" * e * "RxJava 2.x si rivolge direttamente alle API Reactive Stream direttamente" *. Mi sembra una grande differenza per me: cambiarlo dal non implementare direttamente l'API per implementare direttamente l'API. – Andreas

risposta

21

Sia RxJava 1.x sia 2.x sono progettati per essere Java 6+ e quindi non possiamo supportare Java 8 Stream in nessuna delle versioni. Si è deciso di mantenere il supporto della miriade di dispositivi e versioni Android che non verranno mai aggiornati a un runtime compatibile con Java 8. Se è necessario il supporto per Java 8, prendere in considerazione l'utilizzo di Reactor-Core da Pivotal.

La principale differenza tra i due è che 2.x si rivolge direttamente allo SPI Reactive-Streams e per questo è stato completamente riscritto da zero. Siamo attualmente in modalità di anteprima di sviluppo a cui è possibile accedere come descritto nello 2.x branch readme.

La completa riscrittura di 2.x ha migliorato notevolmente il consumo e le prestazioni della memoria; here is a benchmark che confronta varie versioni e librerie.

Sulla superficie dell'API, intendiamo continuare a supportare tutti gli operatori presenti in 1.x e probabilmente estendere entrambe le versioni con nuove per alcuni anni prima del supporto su estremità 1.x.

Poiché 2.x è una nuova architettura, molte librerie dipendenti (ad es. Retrofit) devono essere aggiornate; che probabilmente non accadrà prima della fine di questo agosto o potrebbe anche richiedere diversi mesi per recuperare. Here is the wiki page che contiene i punti salienti delle differenze.

14

Come ho implementato RxJava2 in my sample project-link

Di seguito le differenze tra RxJava2 e RxJava1:

  1. per consentire avente RxJava 1.xe 2.x RxJava side-by-side , RxJava 2.x è sotto le coordinate di prova io.reactivex.rxjava2:rxjava:2.x.y e le classi sono accessibili sotto io.reactivex.

  2. Gli utenti che passano da 1.x a 2.x devono riorganizzare le loro importazioni, ma con attenzione.

  3. onCompleted ->onComplete - senza il trascinamento d

  4. CompositeSubscription ->CompositeDisposable - CompositeDisposable come CompositeSubscription e Subscription sono stati rimossi

  5. Func1 ->Function

  6. Func2 ->BiFunction

  7. limit operatore è stato rimosso - Uso take in RxJava2

RxJava 2.0 è stato completamente riscritto da zero sopra della specifica Reactive-Streams. La specifica stessa si è evoluta da RxJava 1.x e fornisce una base comune per i sistemi e le librerie reattivi.

Poiché i flussi reattivi hanno un'architettura diversa, impongono modifiche a alcuni tipi RxJava ben noti.

RxJava2 ha migliori prestazioni e basso utilizzo della memoria oltre RxJava1

[Fonte:https://github.com/ReactiveX/RxJava/wiki/What%27s-different-in-2.0].

1

Una delle maggiori differenze si applica all'operatore .filter Come indicato dai documenti:

Inoltre, gli operatori richiedono un predicato non utilizzare più Func1<T, Boolean> ma hanno un tipo primitivo-ritorno separato Predicate<T> (permette meglio inlining causa di non autoboxing).

Così, per l'operatore .filter, è necessario modificare come nell'esempio qui sotto

 RxTextView.textChanges(editText) 
      .debounce(400, TimeUnit.MILLISECONDS) 
      .filter(new Predicate<CharSequence>() { 
       @Override 
       public boolean lengthOk(CharSequence charSequence) { 
        return charSequence.length() > 3; 
       } 
      }) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(/* attach your observer */);