2015-08-21 12 views
5

Rx sposób robienia rzeczy może być bardzo skomplikowana i żaden z wielu powodów ... ale czuję, istnieją proste sposoby wykonywania prostych rzeczy z RX ...Jak uruchomić to oświadczenie za pomocą RxJava?

Jak bym po prostu wykonać to oświadczenie w sprawie wątek tła i otrzymać odpowiedź na wątku interfejsu użytkownika?

Wszystkie funkcje tego obiektu należy uruchomić na wątku tła. Pobierz, wstaw, wyczyść i usuń.

String city = Paper.get("city"); 
+0

Zakładam, że 'get' jest funkcją blokującą, która powinna działać na wątku tła? – njzk2

+0

tak, to jest. wszystkie funkcje tego obiektu muszą zostać usunięte z wątku interfejsu użytkownika ... get, delete, put, clear. – sirvon

Odpowiedz

5

Podstawowym obiektem w Rx jest Observable. Obiekt ten zazwyczaj owija obiekt OnSubscribe, który jest po prostu rozszerzeniem Action1, który przyjmuje jako parametr parametr Subscriber.

Co to wszystko oznacza, że ​​po prostu trzeba zdefiniować klasę, która otacza swoją rozmowę i przekazuje wynik do Subscriber:

public class RxPaperGet implements Observable.OnSubscribe<String> { 
    @Override 
    public void call(Subscriber<? super String> t1) { 
     try { 
      t1.onNext(Paper.get("city")); 
     } catch (Throwable t) { 
      t1.onError(t); 
      return; 
     } 
     t1.onCompleted(); 
    } 
} 

To jest prosty przykład. Teraz chcesz go zawijać, aby można było wywoływać dowolną funkcję, a nie tylko Paper.get("city"). Coś takiego jak https://github.com/ReactiveX/RxJavaAsyncUtil/blob/0.x/src/main/java/rx/util/async/operators/OperatorFromFunctionals.java#L44 robi to, pozwalając ci przekazać dowolne Callable.

Które w przypadku byłoby wdrożyć jako:

Observable<String> res = OperatorFromFunctionals.fromCallable(() -> Paper.get("city")); 

(W przypadku, gdy zastanawiasz się, to java8 lambdas wniesione do Androidem retrolambda niezły usunąć gadatliwość Rx).

Gdy już zauważysz, możesz zasubskrybować i uzyskać wyniki. Aby wykonać na tle i pobierać wyniki na wątku UI, zrobiłbyś:

res.subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 

AndroidSchedulers zapewnia rx-android.

Następnie można po prostu calledback z wynikiem:

.subscribe(city -> Log.d(TAG, city)); 

która zwraca subskrypcję, która jest przydatna, gdy trzeba ją anulować.

Ogólnie:

OperatorFromFunctionals.fromCallable(() -> Paper.get("city")) 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(city -> Log.d(TAG, city)); 
+0

to jest niesamowite wyjaśnienie! ty na ya czas – sirvon

+0

Mam trudny czas za pomocą __OperatorFromFunctionals__ jaki jest import, aby wprowadzić go w kodzie? Jest czerwony na Androidzie. Mam rozwiązanie depresji rxjava. – sirvon

+0

identyfikator pakietu na maven jest podany na stronie głównej projektu github, lub możesz po prostu skopiować klasę do swojego projektu – njzk2

0

EDIT: To nie jest poprawne. Nie usuwa jednak odpowiedzi, aby zachować komentarze.

Bardzo prosty przykład:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


    getPaper() 
      .subscribeOn(Schedulers.newThread()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Action1<String>() { 
       @Override 
       public void call(String s) { 
        Log.d("xxx", s); 
       } 
      }); 


} 

private Observable<String> getPaper() { 

    return Observable.just(Paper.get()); 
} 

gdzie Paper.get() jest długa operacja docierania że zwraca String. Sprawdź docs for Scheduler.

Nie zapomnij obserwować w głównym wątku, jeśli chcesz zmienić interfejs użytkownika po otrzymaniu wyniku operacji, w przeciwnym razie otrzymasz wyjątek dotyczący zmiany interfejsu użytkownika spoza wątku interfejsu użytkownika.

+3

' Observable.just() 'uruchomi się na wątku UI. Musisz użyć opcji "odroczyć", aby odłożyć tworzenie do momentu subskrypcji. http://blog.danlew.net/2015/07/23/deferring-observable-code-until-subscription-in-rxjava/ – LordRaydenMK

+0

@LordRaydenMK Myślę, że mieszasz się z rzeczami tutaj. just() imho nie ma nic wspólnego z wątkiem, w którym operacja będzie działać, ale raczej kiedy zostanie uruchomione: just() rozpocznie operację zaraz po utworzeniu Obserwatorium, create() rozpocznie operację tylko wtedy, gdy Obserwowalny jest zasubskrybowany. Nie powinno to mieć znaczenia, ponieważ subskrybujemy natychmiast. Popraw mnie, jeśli się mylę. – FWeigl

+0

cholera Podoba mi się ten prosty przykład. ty! i późniejsze wyjaśnienie właśnie vs stworzyć – sirvon

Powiązane problemy