使用带有RxJava2的OkHttp的NetworkOnMainThreadException

时间:2017-12-20 07:34:16

标签: android okhttp rx-java2

我正在努力学习Rxjava2。我在使用okHttp进行网络调用期间遇到了一个问题,即NetworkOnMainThreadException。我只能使用okHttp libary。

这是我编写RxJava2代码以调用Login API的方法。

@Override
public void onServerLoginClick(LoginRequest.ServerLoginRequest serverLoginRequest) {
    HttpParamObject httpParamObject = ApiGenerator.onServerLogin(serverLoginRequest);
    Service service = ServiceFactory.getInstance(activity, AppConstants.TASKCODES.LOGIN);

    try {
        Observable.just(service.getData(httpParamObject))
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe((Consumer<? super Object>) getObserver());
    } catch (JSONException | IOException | RestException | SQLException e) {
        e.printStackTrace();
    }
}

private Subscriber<LoginResponse> getObserver(){
    return new Subscriber<LoginResponse>() {
        @Override
        public void onSubscribe(Subscription s) {

        }

        @Override
        public void onNext(LoginResponse loginResponse) {
            getUiView().showToast(loginResponse.getMessage());
        }

        @Override
        public void onError(Throwable t) {

        }

        @Override
        public void onComplete() {

        }
    };

}

我做错了什么或遗失了什么?请帮帮我。

2 个答案:

答案 0 :(得分:2)

您在主线程中调用service.getData(httpParamObject)并将结果传递给Observable.just。因此,subscribeOn无效。

查看Observable.create的文档,然后使用它代替Observable.just

答案 1 :(得分:-2)

只需删除Observable.just(),如下所示

  service.getData(httpParamObject)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe((Consumer<? super Object>) getObserver());