2016-05-03 31 views
4

这是我用来进行Http调用的代码。 我无法重现错误,但Bugsnag告诉我,一些用户收到此错误:java.lang.IllegalStateException StrictMode.java在Scheduler.Worker线程上引发的致命异常与Retrofit 2和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); 
    } 
} 

以下是完整的跟踪:

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) 

我也试图订阅的Sheduler.io()Scheduler.newThread(),但我得到同样的错误。

+0

你使用okhttp3吗? – JohnWowUs

+0

我正在使用'com.squareup.retrofit:retrofit:2.0.0-beta2',但我看到beta3使用okhttp3。也许我应该升级? –

+0

最新发布的版本是com.squareup.retrofit2:翻新:2.0.2所以你绝对不应该使用测试版。 – JohnWowUs

回答

1

它看起来像使用okhttp3解决了升级到com.squareup.retrofit2:retrofit:2.0.2问题。

3

请注意,这不是一个永久性的修复,但它帮助我,并可能帮助你。发表评论太长了。

当我使用您提到的特定版本的改造时,我注意到okhttp库和rx与改造的集成存在一个错误(已被解决)。

我不知道修复的状态,但我有一个速战速决这是增加了RX流unsubscribeOn(Schedulers.io()),就像这样:

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

它并没有真正解决这个问题。 ....嗯...... :( –

0

Observable.create()如果你不赶上会发生这种问题。

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

0

我的经验&表明:

检查用户的您onError(Throwable e)onCompleted()法实施,任何可能会引起任何异常。例如,NullPointerException等。

Rxjava无法捕捉从这两种方法抛出的异常。你会得到java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread.你甚至无法从堆栈跟踪中找到异常源。