2016-11-26 2 views
4

Не могу понять, почему это происходит. Ни один из rx-обратных вызовов (onCompleted(), onError(), onNext()) не будет вызван моим вызовом. Единственное, что я получаю это okhttp выход:API-запрос Retrofit API получает сообщение «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 

дооснащения Модуль:

@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:

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

Кстати, оба вызова получают ту же ошибку:

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 

ответ

26

Это исключение выбрасывается, если запрос отменяется пользователем. При использовании RxJavaCallAdapterFactory это происходит, если подписка отменяется до завершения вызова. Поэтому я думаю, что в какой-то момент после того, как вы сделаете звонок, вы делаете subscription.unsubscribe(), который отменяет базовые запросы.

+0

У меня такая же проблема, когда он переместился в одноразовый и поместил его в класс ondestroy класса сервиса намерения и назвал 'disposable.dispose()' –

0

Благодаря @Kiskae. Это дало мне правильный намек. В моем случае я использовал CompositeSubscription и добавил подписку на нее после того, как она была отписана другим методом.

/** 
* Adds a new {@link Subscription} to this {@code CompositeSubscription} if the 
* {@code CompositeSubscription} is not yet unsubscribed. If the {@code CompositeSubscription} <em>is</em> 
* unsubscribed, {@code add} will indicate this by explicitly unsubscribing the new {@code Subscription} as 
* well. 
* 
* @param s 
*   the {@link Subscription} to add 
*/ 
Смежные вопросы