android - 使用 Retrofit 2 和 Rx 在 Scheduler.Worker 线程上抛出致命异常

标签 android retrofit rx-java rx-android

这是我用来进行 Http 调用的代码。 我无法重现错误,但 Bugsnag 告诉我一些用户遇到了这个错误:java.lang.IllegalStateException StrictMode.java

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(),但我得到了同样的错误。

最佳答案

请注意,这不是永久性修复,但它对我有所帮助,也可能对您有所帮助。评论太长了。

当我使用你提到的特定版本的改造时,我注意到 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);
                }
            });

关于android - 使用 Retrofit 2 和 Rx 在 Scheduler.Worker 线程上抛出致命异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36999636/

相关文章:

java - Retrofit - 如何在Retrofit中错误处理NumberFormatException?

Android Retrofit入队方法没有返回值

java - 不存在类型变量 U 的实例,因此 Row 符合 Iterable<?延伸 U>

java - 由于 jpct 游戏引擎中未捕获的异常,主线程退出

android - 简单的 Activity 开关不起作用。没有错误

Android Retrofit api链接介绍

java - 使用过滤器从 map 中删除元素

java - Observable.zip 和 Observable.timer

android - react native | @react-native-community_picker 在 Android 上未解析

java - 嵌套平面图可观察 rxJava