J'ai essayé d'utiliser RxJava avec Retrofit pour chaîner les requêtes réseau sous Android. Mais comme je l'ai indiqué dans le titre, cela provoque une IllegalArgumentException. Dans ce qui suit, vous pouvez voir mon code que j'ai écrit jusqu'à présent (j'ai également inclus les importations et le fichier gradle avec les dépendances que j'utilise pour mon projet):
ApiClient.java:
apply plugin: 'com.android.application' android { compileSdkVersion 28 defaultConfig { applicationId "com.celik.abdullah.hefuxi11" minSdkVersion 19 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } packagingOptions{ exclude 'META-INF/rxjava.properties' } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' implementation 'com.android.support:recyclerview-v7:28.0.0' implementation 'com.android.volley:volley:1.1.1' implementation 'com.google.code.gson:gson:2.8.5' implementation 'com.android.support:cardview-v7:28.0.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' implementation 'com.squareup.retrofit2:converter-gson:2.5.0' implementation 'com.squareup.retrofit2:retrofit:2.5.0' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0' implementation 'io.reactivex:rxandroid:1.2.0' implementation 'io.reactivex:rxjava:1.1.4' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0' }
3 Réponses :
Pour créer un appel juste après l'autre, utilisez opérateur flatMap au lieu de créer un Abonné
dans votre méthode subscribe ()
.
Vous utilisez RxJava 1.x observable et abonnés. Vous avez ajouté une fabrique d'adaptateurs de RxJava 2.x à .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
vous devez importer depuis RxJava 2.x
en conséquence, vous devez mettre également à jour la dépendance
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' implementation 'io.reactivex.rxjava2:rxjava:2.2.6' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' import io.reactivex.Observable; import io.reactivex.schedulers.Schedulers; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable;
Oui, mettez à jour tout vers RxJava2 ou vous pouvez utiliser RxJava1
dans ce cas, vos importations seraient quelque chose comme:
public static CliqueDBApiInterface getCliqueDBApiInterface(){ if(sCliqueDBApiInterface == null){ Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .client(okHttpClient) .build(); sCliqueDBApiInterface = retrofit.create(CliqueDBApiInterface.class); } return sCliqueDBApiInterface; } where okHttpClient = new OkHttpClient.Builder().build();
Et puis votre RetrofitApiInterface serait quelque chose comme ceci:
/* rx */ implementation 'io.reactivex:rxandroid:1.2.1' implementation 'io.reactivex:rxjava:1.3.2' /* retrofit, gson */ implementation 'com.squareup.retrofit2:retrofit:2.4.0' implementation 'com.squareup.retrofit2:adapter-rxjava:2.3.0' implementation 'com.squareup.retrofit2:converter-gson:2.4.0' implementation 'com.squareup.okhttp3:logging-interceptor:3.8.1' implementation 'com.squareup.retrofit2:converter-scalars:2.4.0'