使用RxJava 2 + Retrofit 1.9的NetworkOnMainThreadException

时间:2017-07-05 17:58:44

标签: android retrofit rx-java2 networkonmainthread

我正在使用大量网络调用的大型代码库。它目前适用于Retrofit 1.9和RxJava 1.x.但是,我们正试图去RxJava 2.x。

我目前在RxJava 2代码上获得NetworkOnMainThreadException。我使用的是RxJava 2.x和Retrofit 1.9。计划是稍后转到Retrofit 2.x.但是,就目前而言,我们需要使用RxJava 2 + Retrofit 1.9。

有问题的代码是:

observable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableObserver<Void>() {
    @Override
    public void onNext(Void response) {
        if (listener != null) {
            listener.onSuccess(response);
        }   
    }   

    @Override
    public void onError(Throwable e) {
        if (listener != null) {
            listener.onError(e);
        }   
    }   

    @Override
    public void onComplete() {
        //do nothing for now 
    }   
}); 

当我告诉subscribeOn(Schedulers.io())时,网络操作如何在UI线程上结束?

编辑:根据请求在这里进行堆栈跟踪。我将文件名通用化,因为我不允许透露这些细节...

    retrofit.RetrofitError
     at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:400)
     at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240)
     at java.lang.reflect.Proxy.invoke(Proxy.java:913)
     at <package-name>.network.api.$Proxy40.someApiMethod(Unknown Source)
     at <package-name>.SomeApi.someApiMethod(SomeApi.java:30)
Caused by: android.os.NetworkOnMainThreadException
     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1425)
     at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:102)
     at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:90)
     at java.net.InetAddress.getAllByName(InetAddress.java:787)
     at com.squareup.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29)
     at com.squareup.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:224)
     at com.squareup.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:193)
     at com.squareup.okhttp.internal.http.RouteSelector.next(RouteSelector.java:113)
     at com.squareup.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:344)
     at com.squareup.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:329)
     at com.squareup.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:319)
     at com.squareup.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:241)
     at com.squareup.okhttp.Call.getResponse(Call.java:271)
     at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.java:228)
     at com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.java:199)
     at com.squareup.okhttp.Call.execute(Call.java:79)
     at retrofit.client.OkClient.execute(OkClient.java:53)

0 个答案:

没有答案