ReactiveX / RxJava

RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM.
Apache License 2.0
47.88k stars 7.61k forks source link

When I call the API frequently by Retrofit and observe by RxJava,I will get the Error #4259

Closed dagaozi closed 8 years ago

dagaozi commented 8 years ago

my code like this:

//-------------------------------------------------------------------
 private void getTaobaoData4(String ip) {
   Subscriber subscriber = new Subscriber<TestModel>() {
            @Override
            public void onCompleted() {
                toast.showToast("onCompleted");
            }

            @Override
            public void onError(Throwable e) {
                toast.showToast(NetUtils.checkApiException(e));
            }

            @Override
            public void onNext(TestModel o) {
                toast.showToast(o.getCountry());

            }
        };
        Observable observable = apiStores.getTaobaoData(ip);
     Subscription sn= observable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .map(new HttpResultFunc<TestModel>())
                .subscribe(subscriber);
        addSubscription(sn);

    }
}
//---------------------------------------------------

when I frequently call the Method in my Activity,at first ,it will be ok, but I will got those error sooner or laters when I call this method again and again.

07-30 15:45:52.791 13010-13010/com.wyyy.assetsmanage E/AndroidRuntime: FATAL EXCEPTION: main
                                                                       Process: com.wyyy.assetsmanage, PID: 13010
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:739)
   at android.os.Handler.dispatchMessage(Handler.java:95)
   at android.os.Looper.loop(Looper.java:135)
   at android.app.ActivityThread.main(ActivityThread.java:5453)
   at java.lang.reflect.Method.invoke(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:372)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:952)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
Caused by: rx.exceptions.OnErrorFailedException: Error occurred when trying to propagate error to Observer.onError
   at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:194)
   at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:120)
   at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.pollQueue(OperatorObserveOn.java:191)
   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:739) 
   at android.os.Handler.dispatchMessage(Handler.java:95) 
   at android.os.Looper.loop(Looper.java:135) 
   at android.app.ActivityThread.main(ActivityThread.java:5453) 
   at java.lang.reflect.Method.invoke(Native Method) 
   at java.lang.reflect.Method.invoke(Method.java:372) 
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:952) 
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747) 
Caused by: rx.exceptions.CompositeException: 2 exceptions occurred. 
   at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:194) 
   at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:120) 
   at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.pollQueue(OperatorObserveOn.java:191) 
   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:739) 
   at android.os.Handler.dispatchMessage(Handler.java:95) 
   at android.os.Looper.loop(Looper.java:135) 
   at android.app.ActivityThread.main(ActivityThread.java:5453) 
   at java.lang.reflect.Method.invoke(Native Method) 
   at java.lang.reflect.Method.invoke(Method.java:372) 
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:952) 
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747) 
Caused by: rx.exceptions.CompositeException$CompositeExceptionCausalChain: Chain of Causes for CompositeException In Order Received =>
   at android.util.Log.getStackTraceString(Log.java:335)
   at com.android.internal.os.RuntimeInit.Clog_e(RuntimeInit.java:67)
   at com.android.internal.os.RuntimeInit.access$200(RuntimeInit.java:44)
   at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:93)
   at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)
   at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)
   at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:66)
   at android.os.Handler.handleCallback(Handler.java:739) 
   at android.os.Handler.dispatchMessage(Handler.java:95) 
   at android.os.Looper.loop(Looper.java:135) 
   at android.app.ActivityThread.main(ActivityThread.java:5453) 
   at java.lang.reflect.Method.invoke(Native Method) 
   at java.lang.reflect.Method.invoke(Method.java:372) 
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:952) 
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747) 
Caused by: java.net.SocketTimeoutException
   at java.net.PlainSocketImpl.read(PlainSocketImpl.java:493)
   at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:38)
   at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:238)
   at okio.Okio$2.read(Okio.java:139)
   at okio.AsyncTimeout$2.read(AsyncTimeout.java:211)
   at okio.RealBufferedSource.indexOf(RealBufferedSource.java:306)
   at okio.RealBufferedSource.indexOf(RealBufferedSource.java:300)
   at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:196)
   at okhttp3.internal.http.Http1xStream.readResponse(Http1xStream.java:184)
   at okhttp3.internal.http.Http1xStream.readResponseHeaders(Http1xStream.java:125)
   at okhttp3.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:723)
   at okhttp3.internal.http.HttpEngine.access$200(HttpEngine.java:81)
   at okhttp3.internal.http.HttpEngine$NetworkInterceptorChain.proceed(HttpEngine.java:708)
   at okhttp3.internal.http.HttpEngine.readResponse(HttpEngine.java:563)
   at okhttp3.RealCall.getResponse(RealCall.java:241)
   at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:198)
   at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:203)
   at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:187)
   at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:160)
   at okhttp3.RealCall.execute(RealCall.java:57)
   at retrofit2.OkHttpCall.execute(OkHttpCall.java:177)
   at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:111)
   at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:92)
   at rx.Observable$2.call(Observable.java:162)
   at rx.Observable$2.call(Observable.java:154)
   at rx.Observable$2.call(Observable.java:162)
   at rx.Observable$2.call(Observable.java:154)
   at rx.Observable$2.call(Observable.java:162)
   at rx.Observable$2.call(Observable.java:154)
   at rx.Observable.unsafeSubscribe(Observable.java:8098)
   at rx.internal.operators.OperatorSubscribeOn$1$1.call(OperatorSubscribeOn.java:62)
at rx
akarnokd commented 8 years ago

Maybe toast.showToast(NetUtils.checkApiException(e)); crashes.

dagaozi commented 8 years ago
   @Override
    public void onError(Throwable e) {

        Log.d("onError",e.getMessage());

    }

Even I use this code ,it will be crash again, I don't know why it will be OK at first,at second,at third.......but it will be crash some time at later,and why this error won't be callback in onError(Throwable e) this is the project https://github.com/dagaozi/AssetsManage @akarnokd

akarnokd commented 8 years ago

Your error stacktrace is cut off. Please make sure you have the latest RxJava. If you can, please run your app with RxJavaHooks.enableAssemblyTracking() as it is unclear what is failing where.

akarnokd commented 8 years ago

In fact, make sure you run with the latest version of RxJava, Retrofit and RxAndroid.

dagaozi commented 8 years ago

thinks for your help. Let me try the latest version @akarnokd

iNoles commented 8 years ago

Looks like Okhttp throws java.net.SocketTimeoutException.

akarnokd commented 8 years ago

@iNoles That's obvious. What's not obvious why the above throws OnErrorFailedException even though it seems to properly implement onError that doesn't throw. My suspicion is that an old version of Retrofit is in use which internally doesn't compose properly and ignores an onError.

akarnokd commented 8 years ago

I'm closing this issue due to inactivity. If you have further input on the issue, don't hesitate to reopen this issue or post a new one.

huangjim commented 7 years ago

I have the sample question. How to solve?