Retrofit API call receives "HTTP FAILED: java.io.IOException: Canceled"

25,222

That exception gets thrown if the request is cancelled by the user. When using RxJavaCallAdapterFactory this happens if the subscription is unsubscribed before the call can complete. So I guess at some point after you do the call you do subscription.unsubscribe() which cancels the underlying requests.

Share:
25,222
oleg.v
Author by

oleg.v

Updated on October 26, 2021

Comments

  • oleg.v
    oleg.v over 2 years

    Can't figure out why is this happening. Neither one of rx callbacks (onCompleted(), onError(), onNext()) not gets triggered by my call. The only thing i receive is this okhttp output:

    D/OkHttp: --> GET https://api.privatbank.ua/p24api/exchange_rates?json=true&date=20.11.2016 http/1.1
    D/OkHttp: --> END GET
    D/OkHttp: <-- HTTP FAILED: java.io.IOException: Canceled
    

    Retrofit module:

    @Module
    public class RestModule {
    
        @Provides
        @Singleton
        public HttpLoggingInterceptor providesHttpLogginInterceptor() {
            return new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY);
        }
    
        @Provides
        @Singleton
        public OkHttpClient providesOkHttpClient(@NonNull HttpLoggingInterceptor loggingInterceptor) {
            return new OkHttpClient.Builder()
                .addInterceptor(loggingInterceptor)
                .connectTimeout(ConstantsManager.CONNECTION_TIME_OUT, TimeUnit.SECONDS)
                .readTimeout(ConstantsManager.READ_TIME_OUT, TimeUnit.SECONDS)
                .build();
        }
    
        @Provides
        @Singleton
        public Gson providesGson() {
            return new GsonBuilder().create();
        }
    
        @Provides
        @Singleton
        public Retrofit providesRetrofit(@NonNull OkHttpClient okHttpClient, @NonNull Gson gson) {
            return new Retrofit.Builder()
                .baseUrl(ConstantsManager.BASE_URL)
                .client(okHttpClient)
                .addConverterFactory(SimpleXmlConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create(gson))
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
        }
    
        @Provides
        @Singleton
        public PrivatbankApi providesPrivatbankApi(@NonNull Retrofit retrofit) {
            return retrofit.create(PrivatbankApi.class);
        }
    }
    

    API interface:

    public interface PrivatbankApi {
    
        @GET
        Observable<CurrentRates> loadCurrentRates(@NonNull @Url String url);
    
        @GET("exchange_rates")
        Observable<DateRates> loadDateRates(@NonNull @Query("json") Boolean json, @NonNull @Query("date") String date);
    
    }
    

    Subscription:

    subscription = dataManager.loadDateRates(date)
                    .subscribeOn(Schedulers.io())
                    .doAfterTerminate(() -> {
                    })
                    .subscribe(dateRates -> {
                        // My code here...
                    }, throwable -> {
                        Timber.e(throwable, "Error while loading data occurred!");
                    });
    

    By the way, both of the calls gets the same error:

    D/OkHttp: --> GET https://privat24.privatbank.ua/p24/accountorder?oper=prp&PUREXML&apicour&country=ua http/1.1
    D/OkHttp: --> END GET
    D/OkHttp: <-- HTTP FAILED: java.io.IOException: Canceled
    D/OkHttp: --> GET https://api.privatbank.ua/p24api/exchange_rates?json=true&date=20.11.2016 http/1.1
    D/OkHttp: --> END GET
    D/OkHttp: <-- HTTP FAILED: java.io.IOException: Canceled