2014-05-03 14 views
10

To było moje zrozumienie, że rxjava-android wykonuje operacje na osobnym wątku (pod warunkiem, że jest to poprawny Scheduler), co prowadzi do operacji nieblokujących, jednak szybki i brudny test zdaje się potwierdzać, że jest to nieprawidłowe.Android RxJava, bez blokowania?

użyłem następujące fragmenty kodu, a w obu scenariuszach, interfejs użytkownika był blokowany ...

urywek 1

Observable observable = Observable.create(new Observable.OnSubscribe<Object>() { 
    @Override 
    public void call(Subscriber<? super Object> subscriber) { 
    int i = 0; 
    while (i == 0) {} 
    subscriber.onCompleted(); 
    } 
}); 
observable.subscribeOn(Schedulers.newThread()); 
observable.observeOn(AndroidSchedulers.mainThread()); 
observable.subscribe(); 

Snippet 2

Observable observable = Observable.create(new Observable.OnSubscribe<Object>() { 
    @Override 
    public void call(Subscriber<? super Object> subscriber) { 
    SystemClock.sleep(5000); 
    subscriber.onCompleted(); 
    } 
}); 
observable.subscribeOn(Schedulers.newThread()); 
observable.observeOn(AndroidSchedulers.mainThread()); 
observable.subscribe(); 

Czy coś mi umyka?

Odpowiedz

28

Błąd polega na tym, że używasz niewłaściwego Observable. Poprawny kod powinien być:

Observable observable = Observable.create(new Observable.OnSubscribe<Object>() { 
    @Override 
    public void call(Subscriber<? super Object> subscriber) { 
    int i = 0; 
    while (i == 0) {} 
    subscriber.onCompleted(); 
    } 
}); 
observable.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()).subscribe(); 

Zarówno subscribeOn i observeOn powrócić nowy Obserwowalne który realizuje swoje funkcje. Ale oryginalna obserwowalna nie jest modyfikowana. W rzeczywistości każdy operator zawsze tworzy nowy Observable bez modyfikowania oryginału.

+0

Dokładnie, kluczem jest połączenie metod. –

+0

Jaki jest analog "AndroidSchedulers.mainThread()" dla środowiska graficznego? – YNChumak

+0

Masz na myśli Swing? Zobacz https://github.com/ReactiveX/RxSwing/blob/0.x/src/main/java/rx/schedulers/SwingScheduler.java – zsxwing

Powiązane problemy