为什么不在正确的线程上创建可观察对象? Observable-Observable=Observable.from(返回阵列(下载网页(“URL”)) .map(新函数1(){ @凌驾 公共对呼叫(字符串[],共个){ 返回新的一对, backToArray(下载网页(URL+of[0])。获取(0)); } }); observable.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()).subscribe( (新观察员(){ @凌驾 未完成的公共无效(){ //如果需要,更新用户界面 } @凌驾 公共作废登记员(可丢弃的t){ //更新用户界面以处理错误 } @凌驾 公共void onNext(对p){ 添加(新办公室((字符串[])p.first,(字符串[])p.second)); } }));

为什么不在正确的线程上创建可观察对象? Observable-Observable=Observable.from(返回阵列(下载网页(“URL”)) .map(新函数1(){ @凌驾 公共对呼叫(字符串[],共个){ 返回新的一对, backToArray(下载网页(URL+of[0])。获取(0)); } }); observable.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()).subscribe( (新观察员(){ @凌驾 未完成的公共无效(){ //如果需要,更新用户界面 } @凌驾 公共作废登记员(可丢弃的t){ //更新用户界面以处理错误 } @凌驾 公共void onNext(对p){ 添加(新办公室((字符串[])p.first,(字符串[])p.second)); } }));,android,network-programming,system.reactive,rx-java,rx-android,Android,Network Programming,System.reactive,Rx Java,Rx Android,这运行,我得到android.os.NetworkOnMainThreadException。我希望它运行subscribeOn()方法设置的新线程。假设实际的网络请求发生在downloadWebPage()中,错误在代码的第一行: Observable observable = Observable.from(backToArray(downloadWebPage("URL"))) .map(new Func1<String[], Pair<String[]

这运行,我得到android.os.NetworkOnMainThreadException。我希望它运行subscribeOn()方法设置的新线程。

假设实际的网络请求发生在
downloadWebPage()
中,错误在代码的第一行:

Observable observable = Observable.from(backToArray(downloadWebPage("URL")))
            .map(new Func1<String[], Pair<String[], String[]>>() {
                @Override
                public Pair<String[], String[]> call(String[] of) {
                    return new Pair<>(of,
                            backToArray(downloadWebPage("URL" + of[0])).get(0));
                }
            });

    observable.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()).subscribe(
            (new Observer<Pair>() {

                @Override
                public void onCompleted() {
                    // Update user interface if needed
                }

                @Override
                public void onError(Throwable t) {
                    // Update user interface to handle error
                }

                @Override
                public void onNext(Pair p) {
                   offices.add(new Office((String[]) p.first, (String[]) p.second));
                }
           }));
这相当于:

Observable observable = Observable.from(backToArray(downloadWebPage("http://api.ataxcloudapp.com/v1/franchise/listing/?location=" + ZIPCode)))
这应该清楚地表明,
downloadwebage
是在主线程上执行的,甚至在创建任何
observeable
之前执行的,更不用说订阅了。在这方面,RxJava不能改变Java的语义

但是,您可以这样做(未经测试,但应该是正确的):

Observable-Observable=Observable.create(new Observable.OnSubscribe()){
@凌驾

public void call(最终订户假设实际网络请求发生在
downloadWebPage()
中,错误出现在代码的第一行:

Observable observable = Observable.from(backToArray(downloadWebPage("URL")))
            .map(new Func1<String[], Pair<String[], String[]>>() {
                @Override
                public Pair<String[], String[]> call(String[] of) {
                    return new Pair<>(of,
                            backToArray(downloadWebPage("URL" + of[0])).get(0));
                }
            });

    observable.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()).subscribe(
            (new Observer<Pair>() {

                @Override
                public void onCompleted() {
                    // Update user interface if needed
                }

                @Override
                public void onError(Throwable t) {
                    // Update user interface to handle error
                }

                @Override
                public void onNext(Pair p) {
                   offices.add(new Office((String[]) p.first, (String[]) p.second));
                }
           }));
这相当于:

Observable observable = Observable.from(backToArray(downloadWebPage("http://api.ataxcloudapp.com/v1/franchise/listing/?location=" + ZIPCode)))
这应该清楚地表明,
下载网页
是在主线程上执行的,甚至在创建任何
可观察的
之前执行的,更不用说订阅了。在这方面,RxJava不能改变Java的语义

但是,您可以这样做(未经测试,但应该是正确的):

Observable-Observable=Observable.create(new Observable.OnSubscribe()){
@凌驾
public void call(最终订户您可以使用它将
下载网页
的呼叫推迟到您订阅可观察到的页面时

例如:

Observable observable = Observable.create(new Observable.OnSubscribe<String[]>() {
        @Override
        public void call(final Subscriber<? super String[]> subscriber) {
            final String[] response = downloadWebPage("http://api.ataxcloudapp.com/v1/franchise/listing/?location=" + ZIPCode);
            if (! subscriber.isUnsubscribed()) {
                subscriber.onNext(backToArray(response));
                subscriber.onCompleted();
            }
        }
)
private Object slowBlockingMethod(){…}
公共可观测新方法(){
返回Observable.defer(()->Observable.just(slowBlockingMethod());
}

您可以使用将调用
下载网页
的时间推迟到您订阅observable时

例如:

Observable observable = Observable.create(new Observable.OnSubscribe<String[]>() {
        @Override
        public void call(final Subscriber<? super String[]> subscriber) {
            final String[] response = downloadWebPage("http://api.ataxcloudapp.com/v1/franchise/listing/?location=" + ZIPCode);
            if (! subscriber.isUnsubscribed()) {
                subscriber.onNext(backToArray(response));
                subscriber.onCompleted();
            }
        }
)
private Object slowBlockingMethod(){…}
公共可观测新方法(){
返回Observable.defer(()->Observable.just(slowBlockingMethod());
}

您应该从

private Object slowBlockingMethod() { ... }

public Observable<Object> newMethod() {
    return Observable.defer(() -> Observable.just(slowBlockingMethod()));
}


你应该从

private Object slowBlockingMethod() { ... }

public Observable<Object> newMethod() {
    return Observable.defer(() -> Observable.just(slowBlockingMethod()));
}


您可以使用
Observable.defer()
在订阅时创建可观察对象。查看我的答案。您可以使用
Observable.defer()
在订阅时创建可观察对象。查看我的答案。