JakeWharton / u2020

A sample Android app which showcases advanced usage of Dagger among other open source libraries.
https://www.youtube.com/watch?v=0XHx9jtxIxU
Apache License 2.0
5.68k stars 932 forks source link

Retrofit 2.0.0-beta2 android.os.NetworkOnMainThreadException #215

Closed seiton-it closed 8 years ago

seiton-it commented 8 years ago

Hi there is some serious bug in that retrofit version. i get exception

Failed to get trending repositories
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView: android.os.NetworkOnMainThreadException
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at java.net.InetAddress.lookupHostByName(InetAddress.java:418)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at java.net.InetAddress.getAllByName(InetAddress.java:215)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at com.squareup.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at com.squareup.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:187)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at com.squareup.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:156)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at com.squareup.okhttp.internal.http.RouteSelector.next(RouteSelector.java:98)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at com.squareup.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:344)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at com.squareup.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:327)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at com.squareup.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:245)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at com.squareup.okhttp.Call.getResponse(Call.java:267)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.java:224)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at com.jakewharton.u2020.data.api.LoggingInterceptor.intercept(LoggingInterceptor.java:28)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.java:221)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at com.jakewharton.u2020.data.api.oauth.OauthInterceptor.intercept(OauthInterceptor.java:25)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.java:221)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.java:195)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at com.squareup.okhttp.Call.execute(Call.java:79)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at retrofit.OkHttpCall.execute(OkHttpCall.java:116)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at retrofit.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:111)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at retrofit.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:88)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at rx.Observable$2.call(Observable.java:162)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at rx.Observable$2.call(Observable.java:154)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at rx.Observable$2.call(Observable.java:162)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at rx.Observable$2.call(Observable.java:154)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at rx.Observable.unsafeSubscribe(Observable.java:7710)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at rx.internal.operators.OperatorMerge$MergeSubscriber.onNext(OperatorMerge.java:231)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at rx.internal.operators.OperatorMerge$MergeSubscriber.onNext(OperatorMerge.java:140)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at rx.internal.operators.OperatorMap$1.onNext(OperatorMap.java:55)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at rx.subjects.SubjectSubscriptionManager$SubjectObserver.onNext(SubjectSubscriptionManager.java:224)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at rx.subjects.PublishSubject.onNext(PublishSubject.java:114)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at com.jakewharton.u2020.ui.trending.TrendingView$5.run(TrendingView.java:182)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at android.os.Handler.handleCallback(Handler.java:739)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at android.os.Handler.dispatchMessage(Handler.java:95)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at android.os.Looper.loop(Looper.java:135)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at android.app.ActivityThread.main(ActivityThread.java:5312)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at java.lang.reflect.Method.invoke(Native Method)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at java.lang.reflect.Method.invoke(Method.java:372)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
10-12 21:29:04.583 28473-28473/com.jakewharton.u2020.internal.debug E/TrendingView:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)

If i switch to retrofit 2.0.0-beta1 everything works like charm

JakeWharton commented 8 years ago

Retrofit 2's observables execute synchronously. Use subscribeOn to put its work on a background thread.

p-fischer commented 8 years ago

I observed similar behavior. I'm performing a call from main thread using the asynchronous option with enqueue(). Additionally I added this interceptor

public class MyInterceptor implements com.squareup.okhttp.Interceptor
{
    @Override
    public Response intercept( Chain chain ) throws IOException
    {
        Request request = chain.request();

        Log.i( "Interceptor", "before request" );

        Response response = chain.proceed( request );

        Log.i( "Interceptor", "after request" );

        return response;
    }
}

... with this line: retrofit.client().interceptors().add( new MyInterceptor() );

I would expect the interceptor to run in an asynchronous thread, e.g. the one which is created for my asynchronous call. With retrofit 2.0.0-beta1 my code works. However with retrofit 2.0.0-beta2 I get the NetworkOnMainThreadException exception.

Is this a bug or an intential change? How do I fix my interceptor?

Update: this version of the interceptor works with retrofit 2.0.0-beta2 too:

public class MyInterceptor implements com.squareup.okhttp.Interceptor
{
    @Override
    public Response intercept( Chain chain ) throws IOException
    {
        Request request = chain.request();

        Log.i( "Interceptor", "before request" );

        return chain.proceed( request );
    }
}

This allows for intercepting on the request. However, I have no idea on how to intercept on the response.