2016-11-26 4 views
4

Kann nicht herausfinden, warum das passiert. Weder einer der RX-Callbacks (onCompleted(), onError(), onNext()) wird nicht von meinem Aufruf ausgelöst. Das einzige, was ich erhalten, ist diese okhttp Ausgabe:Retrofit-API-Aufruf empfängt "HTTP FAILED: java.io.IOException: Storniert"

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 

Nachrüstmodul:

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

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); 

} 

Abonnement:

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, beide Aufrufe erhalten denselben Fehler:

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 

Antwort

26

Diese Ausnahme wird ausgelöst, wenn die Anforderung vom Benutzer abgebrochen wird. Bei Verwendung von RxJavaCallAdapterFactory geschieht dies, wenn das Abonnement abgemeldet wird, bevor der Anruf abgeschlossen werden kann. Ich nehme an, irgendwann nachdem Sie den Anruf ausgeführt haben, tun Sie subscription.unsubscribe(), was die zugrunde liegenden Anfragen löscht.

+0

Ich habe das gleiche Problem, wenn es zu Disposable und legte es in Ondestroy-Klasse der Absicht Service-Klasse und Aufruf 'disposable.dispose()' –

0

Dank @Kiskae. Das gab mir den richtigen Hinweis. In meinem Fall habe ich eine CompositeSubscription verwendet und eine Subskription hinzugefügt, nachdem sie von einer anderen Methode abgemeldet wurde.

/** 
* 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 
*/ 
Verwandte Themen