我一直在使用AndroidObservable
来进行需要在UI线程上发生的操作。我现在发现自己处于这种情况:我需要在主线程上执行操作,然后根据结果更改UI。我的尝试看起来像这样:
subscription = AndroidObservable.bindActivity(this, Observable.just(null))
.observeOn(Schedulers.io())
.subscribe(new Action1<Object>() {
@Override
public void call(Object o) {
if (doCheckThatMustBeOffMainThread()) {
doSomethingWithTheUI();
}
}
});
这是有问题的,因为我现在正在与主线程的UI进行交互。
我正在部分地使用AndroidObservable
,因为我知道(想想?)我可以通过取消订阅onDestroy()
来避免内存泄漏,但考虑到AndroidObservable
的这种使用似乎是多么做作(创建)一个可以发出null的observable ...)而且我无法与主线程上的UI进行交互,这让我觉得可能有一种更合适的方式来使用AndroidObservable
s - 或者一种替代方法,它也可以安全地避免内存泄漏。这可能是什么?
答案 0 :(得分:0)
您需要将支票移至自己的Observable。这样你就可以控制它运行的调度程序。
Observable<Boolean> doCheckObservable =
Observable
.create(new Observable.OnSubscribe<Boolean>() {
@Override
public void call(Subscriber<? super Boolean> subscriber) {
// Runs on the io thread when subscribed to.
// Do check that returns true or false.
subscriber.onNext(doCheckThatMustBeOffMainThread());
subscriber.onCompleted();
}
})
.subscribeOn(Schedulers.io());
Subscription subscription =
AndroidObservable
.bindActivity(this, doCheckObservable)
.subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean doThatCheckPassed) {
if (doThatCheckPassed) {
// bindActivity() makes this run on the main thread.
doSomethingWithTheUI();
}
}
});
答案 1 :(得分:0)
// NOTE: This is now AppObservable in the latest RxAndroid release.
AndroidObservable.bindActivity(this, Observable.defer(
new Func0<Observable<Void>>() {
@Override
public Observable<Void> call() {
return doCheckThatMustBeOffMainThread() ?
Observable.just(null) : Observable.empty();
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Void>() {
@Override
public void call(Void unused) {
doSomethingWithTheUi();
}
}));
这样你仍然可以通过一个observable推送null,但这次它只是被用作一个信号,并且工作发生在你需要的地方:在io land中检查,以及对UI线程的反应