2016-05-03 7 views
4

Dies ist der Code, den ich verwenden, um HTTP-Aufruf zu machen. Ich kann den Fehler nicht reproduzieren, sondern Bugsnag sagt mir, dass einige Benutzer diesen Fehler erhalten: java.lang.IllegalStateException StrictMode.javaSchwerwiegende Ausnahme auf Scheduler geworfen. Worker-Thread mit Retrofit 2 und Rx

public class ApiManager { 
    public interface Callback<T> { 
     void onError(Throwable e); 

     void onSuccess(T result); 
    } 

    private ApiService _apiService; 

    public ApiManager() { 
     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(BuildConfig.BASE_URL) 
       .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .client(ew OkHttpClient()) 
       .build(); 
     _apiService = retrofit.create(ApiService.class); 
    } 

    private <T> void execute(Observable<T> observable, final Callback<T> callback) { 
     observable.subscribeOn(Schedulers.computation()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Subscriber<T>() { 
        @Override 
        public void onCompleted() { 
        } 

        @Override 
        public void onError(Throwable e) { 
         callback.onError(e); 
        } 

        @Override 
        public void onNext(T result) { 
         callback.onSuccess(result); 
        } 
       }); 
    } 

    public void createUser(Callback<Void> callback) { 
     execute(_apiService.createUser(new User()), callback); 
    } 

    // Retrofit Service 
    public interface ApiService { 
     @POST("users") 
     Observable<Void> createUser(@Body User user); 
    } 
} 

Hier ist die vollständige Spur:

java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread. 
     at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:62) 
     at android.os.Handler.handleCallback(Handler.java:725) 
     at android.os.Handler.dispatchMessage(Handler.java:92) 
     at android.os.Looper.loop(Looper.java:153) 
     at android.app.ActivityThread.main(ActivityThread.java:5340) 
     at java.lang.reflect.Method.invokeNative(Method.java:-2) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609) 
     at dalvik.system.NativeStart.main(NativeStart.java:-2) 
Caused by: rx.exceptions.UnsubscribeFailedException 
     at rx.observers.SafeSubscriber.onCompleted(SafeSubscriber.java:98) 
     at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.pollQueue(OperatorObserveOn.java:195) 
     at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber$2.call(OperatorObserveOn.java:162) 
     at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55) 
     at android.os.Handler.handleCallback(Handler.java:725) 
     at android.os.Handler.dispatchMessage(Handler.java:92) 
     at android.os.Looper.loop(Looper.java:153) 
     at android.app.ActivityThread.main(ActivityThread.java:5340) 
     at java.lang.reflect.Method.invokeNative(Method.java:-2) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609) 
     at dalvik.system.NativeStart.main(NativeStart.java:-2) 
Caused by: android.os.NetworkOnMainThreadException 
     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1128) 
     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.close(OpenSSLSocketImpl.java:906) 
     at com.squareup.okhttp.Connection.closeIfOwnedBy(Connection.java:148) 
     at com.squareup.okhttp.OkHttpClient$1.closeIfOwnedBy(OkHttpClient.java:75) 
     at com.squareup.okhttp.internal.http.HttpConnection.closeIfOwnedBy(HttpConnection.java:137) 
     at com.squareup.okhttp.internal.http.HttpTransport.disconnect(HttpTransport.java:135) 
     at com.squareup.okhttp.internal.http.HttpEngine.disconnect(HttpEngine.java:573) 
     at com.squareup.okhttp.Call.cancel(Call.java:122) 
     at retrofit.OkHttpCall.cancel(OkHttpCall.java:162) 
     at retrofit.RxJavaCallAdapterFactory$CallOnSubscribe$1.call(RxJavaCallAdapterFactory.java:102) 
     at rx.subscriptions.BooleanSubscription.unsubscribe(BooleanSubscription.java:71) 
     at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:124) 
     at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:113) 
     at rx.Subscriber.unsubscribe(Subscriber.java:98) 
     at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:124) 
     at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:113) 
     at rx.Subscriber.unsubscribe(Subscriber.java:98) 
     at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:124) 
     at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:113) 
     at rx.Subscriber.unsubscribe(Subscriber.java:98) 
     at rx.observers.SafeSubscriber.onCompleted(SafeSubscriber.java:95) 
     at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.pollQueue(OperatorObserveOn.java:195) 
     at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber$2.call(OperatorObserveOn.java:162) 
     at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55) 
     at android.os.Handler.handleCallback(Handler.java:725) 
     at android.os.Handler.dispatchMessage(Handler.java:92) 
     at android.os.Looper.loop(Looper.java:153) 
     at android.app.ActivityThread.main(ActivityThread.java:5340) 
     at java.lang.reflect.Method.invokeNative(Method.java:-2) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609) 
     at dalvik.system.NativeStart.main(NativeStart.java:-2) 

Ich habe auch versucht, auf Sheduler.io() abonnieren und , aber ich bekomme den gleichen Fehler.

+0

Verwenden Sie okhttp3? – JohnWowUs

+0

Ich benutze 'com.squareup.retrofit: Nachrüstung: 2.0.0-beta2', aber ich sehe, dass die Beta3 okhttp3 verwenden. Vielleicht sollte ich upgraden? –

+0

Die neueste veröffentlichte Version ist com.squareup.retrofit2: Nachrüstung: 2.0.2, also sollten Sie auf keinen Fall die Beta verwenden. – JohnWowUs

Antwort

1

Es zu com.squareup.retrofit2:retrofit:2.0.2 wie ein Upgrade okhttp3 die gelöst mit aussieht Problem.

3

Beachten Sie, dies ist keine dauerhafte Lösung, aber es hat mir geholfen und könnte Ihnen helfen. Es ist zu lang, um einen Kommentar abzugeben.

Während ich die spezifische Version von Retrofit verwendete, die Sie erwähnt haben, bemerkte ich, dass es einen Fehler gab (bereits adressiert) mit der -Bibliothek und der RX-Integration mit Retrofit.

Ich weiß nicht, den Zustand der fix, aber ich habe eine schnelle Lösung, die unsubscribeOn(Schedulers.io()), wie so zum rx Strom Zugabe wurde:

observable.subscribeOn(Schedulers.computation()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .unsubscribeOn(Schedulers.io()) 
      .subscribe(new Subscriber<T>() { 
       @Override 
       public void onCompleted() { 
       } 

       @Override 
       public void onError(Throwable e) { 
        callback.onError(e); 
       } 

       @Override 
       public void onNext(T result) { 
        callback.onSuccess(result); 
       } 
      }); 
+0

Es behebt dieses Problem nicht wirklich. .... Hm ... :( –

0

Etwas falsch in Observable.create() auftreten, wenn Sie diese Frage nicht fangen wird.

Observable.create((Subscriber<? super Object subscriber) -> { // something wrong occur in here ,you can surround these codes by try catch });

0

Meine Erfahrung & schlägt vor:

Überprüfen Sie Ihre onError(Throwable e) und onCompleted() Methode der Abonnenten implementieren, ist eine mögliche jede Ausnahme verursachen kann. Zum Beispiel NullPointerException usw.

Rxjava kann die Ausnahme, die von dieser zwei Methode werfen, nicht abfangen. Und Sie erhalten java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread., die Sie sogar die Ausnahmequelle aus dem Stack-Trace nicht finden können.

Verwandte Themen