[英]RxJava: Consume result of Observable on another thread
我需要在后台線程上執行一些工作,然后在主線程上交付結果。 我執行以下操作:
Observable.just(new Object()).subscribeOn(Schedulers.newThread()).subscribeWith(new DisposableObserver<Object>() {
@Override
public void onNext(Object s) {
try {
doSomething()
Observable.just(new Object())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Object>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Object o) {
completion.deliverResult()
onComplete();
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
} catch (DriverException e) {
badThingsHappened()
onError(e);
}
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
但是我不喜歡這段代碼,它看起來很復雜,並且沒有使用很多東西。
有沒有辦法使它更優雅?
您的代碼可以轉換為與此類似的代碼:
Observable
.create(emitter -> {
Result result;
try {
result = doSomething();
} catch (Exception error) {
emitter.onError(error);
return;
} finally {
if (result == null) {
emitter.onError(new IllegalStateException("Result cannot be null"));
return;
}
}
emitter.onNext(result);
emitter.onComplete();
})
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(result -> completion.deliverResult(result),
throwable -> badThingsHappened(throwable));
但是,通過這種方法,您將傳統的回調與響應式編程混合在一起: completion.deliverResult()
是標准的回調。 而不是這樣做,而是返回可觀察流本身,並讓感興趣的客戶端觀察該流本身。
您可以用幾行代碼來完成所需的操作。
在此代碼段中,我將從Callable創建一個Observable對象。 計算將在IO線程上完成,但結果(或最終出現錯誤)將在Android主線程上觀察到
void execute() {
// here you get your observable (api, db, other repositories). I'll create a simple String observable
Observable<String> observable = Observable.fromCallable(
() -> "This method will be executed on IO Thread"
);
// here you create your observer. I'll observe a string, so I need a Observer<String> obj
Observer<String> stringObserver = new StringObserver();
//now the observable will do his job on IO thread, but the result is emitted on mainThread
observable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(stringObserver);
}
class StringObserver extends DisposableObserver<String> {
@Override
public void onNext(String s) {
//will be executed on main thread
}
@Override
public void onError(Throwable e) {
//will be executed on main thread
}
@Override
public void onComplete() {
//will be executed on main thread
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.