从mainThread()切换到io()

时间:2016-08-25 06:07:59

标签: android concurrency rx-java rx-android

我有一些代码首先必须在AndroidSchedulers.mainThread()上运行,然后必须执行HTTP请求,因此必须在Schedulers.io()上运行,并在UI上处理结果,所以回到{{ 1}}。

AndroidSchedulers.mainThread()切换到InterruptedIOException时,我会收到AndroidSchedulers.mainThread()

这里有一些代码:

Scheulers.io()

Model model = getModel(); Completable.fromAction( new Action0() { public void call() { mSubject.onNext(model) } }) .subscribeOn(AndroidSchedulers.mainThread()) .observeOn(Schedulers.io()) .andThen(fetchFromServer()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(/* handle success and error */); ... public <T> Single<T> fetchFromServer() { Request request = new Request(); // some request from server, not important return bodyFrom2(request); } public <T> Single<T> bodyFrom2(final Request<T> request) { return Single.defer(new Callable<Single<T>>() { @Override public Single<T> call() throws Exception { try { Response<T> response = request.execute(); if (response.error() != null) return Single.error(response.error().getMessage()); else { return Single.just(response.body()); } } catch (IOException e) { return Single.error(e); } } }); } public static <T> Single<T> bodyFrom1(final Request<T> request) { return Single.create(new Single.OnSubscribe<T>() { @Override public void call(SingleSubscriber<? super T> subscriber) { try { Response<T> response = request.execute(); if (subscriber.isUnsubscribed()) return; if (response.error() != null) subscriber.onError(response.error().getMessage()); else { subscriber.onSuccess(response.body()); } } catch (IOException e) { if (subscriber.isUnsubscribed()) return; subscriber.onError(e); } } }); } (1或2)bodyFrom()抛出异常。 我使用了request.execute(),但我找到了this question on SO,并考虑尝试使用第二个。无论如何,我收到了例外。

试图找出问题的原因和位置,我试过了:

bodyFrom1()

仍会抛出Completable.complete() .subscribeOn(AndroidSchedulers.mainThread()) .observeOn(Schedulers.io()) .andThen(fetchFromServer()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(/* handle success and error */); ,而且:

InterruptedIOException

工作正常。

编辑:

  • 如果我使用Completable.complete() .subscribeOn(Schedulers.computation()) .observeOn(Schedulers.io()) .andThen(fetchFromServer()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(/* handle success and error */); Observable代替Single,似乎可行。
  • 在RxAndroid&#39; Github上添加了一个问题。

0 个答案:

没有答案