RxAndroid et Retrofit: impossible de créer un adaptateur d'appel pour io.reactivex.Observable & lt; retrofit2.Response & lt; okhttp3.ResponseBody & gt; & gt;
Je suis en train d'utiliser rxJava, rxAndroid, Retrofit2, et OkHTTP3 de télécharger un fichier depuis une URL de point de terminaison. Mon code est incapable de créer l'appel de l'adaptateur pour un "Observable< retrofit2.Réponse< okhttp3.ResponseBody>>". Ces méthodes sont nouvelles pour moi, donc je crois que je suis absent un concept important. N'importe quelle direction ou de points est grandement apprécié.
EXCEPTION FATALE: principal
Processus: com.exemple.khe11e.rxdownloadfile, PID: 14130
java.lang.IllegalArgumentException: Impossible de créer l'appel de l'adaptateur pour io.reactivex.Observables>
pour la méthode RetrofitInterface.downloadFileByUrlRx
au retrofit2.ServiceMethod$Builder.methodError(ServiceMethod.java:720)
au retrofit2.ServiceMethod$Builder.createCallAdapter(ServiceMethod.java:234)
au retrofit2.ServiceMethod$Builder.construire(ServiceMethod.java:160)
au retrofit2.Rattrapage.loadServiceMethod(Rénovation.java:166)
au retrofit2.Rénovation de$1.invoke(Rénovation.java:145)
à java.lang.de réfléchir.Proxy.invoke(Proxy.java:393)
à $Proxy0.downloadFileByUrlRx(Source Inconnue)
au com.exemple.khe11e.rxdownloadfile.MainActivity.downloadImage(MainActivity.java:46)
au com.exemple.khe11e.rxdownloadfile.MainActivity$1.onClick(MainActivity.java:39)
au android.vue.Vue.performClick(point de Vue.java:5207)
au android.vue.Afficher$PerformClick.exécuter(point de Vue.java:21168)
au android.os.Gestionnaire d'.handleCallback(Handler.java:746)
au android.os.Gestionnaire d'.dispatchMessage(Handler.java:95)
au android.os.Looper.boucle(Looper.java:148)
au android.app.ActivityThread.principale(ActivityThread.java:5491)
à java.lang.de réfléchir.La méthode.invoke(Native method)
au com.android.interne.os.ZygoteInit$MethodAndArgsCaller.exécuter(ZygoteInit.java:728)
au com.android.interne.os.ZygoteInit.principale(ZygoteInit.java:618)
Causés par: java.lang.IllegalArgumentException: impossible de localiser l'appel de l'adaptateur pour io.reactivex.Observables>.
Essayé:
* retrofit2.l'adaptateur.rxjava.RxJavaCallAdapterFactory
* retrofit2.ExecutorCallAdapterFactory
au retrofit2.Rattrapage.nextCallAdapter(Rénovation.java:237)
au retrofit2.Rattrapage.callAdapter(Rénovation.java:201)
au retrofit2.ServiceMethod$Builder.createCallAdapter(ServiceMethod.java:232)
... 16 plus
construire.gradle:
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'io.reactivex.rxjava2:rxjava:2.0.4'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
RetrofitInterface.java:
package com.example.khe11e.rxdownloadfile;
import io.reactivex.Observable;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Response;
import retrofit2.http.GET;
import retrofit2.http.Streaming;
import retrofit2.http.Url;
public interface RetrofitInterface {
//Retrofit 2 GET request for rxjava
@Streaming
@GET
Observable<Response<ResponseBody>> downloadFileByUrlRx(@Url String fileUrl);
}
MainActivity.java:
package com.example.khe11e.rxdownloadfile;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import java.io.File;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;
import okhttp3.OkHttpClient;
import okhttp3.ResponseBody;
import okio.BufferedSink;
import okio.Okio;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
public class MainActivity extends AppCompatActivity {
Button downloadImgBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
downloadImgBtn = (Button) findViewById(R.id.downloadImgBtn);
downloadImgBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
downloadImage();
}
});
}
public void downloadImage(){
RetrofitInterface downloadService = createService(RetrofitInterface.class, "https://www.nasa.gov/");
downloadService.downloadFileByUrlRx("sites/default/files/iss_1.jpg")
.flatMap(processResponse())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(handleResult());
}
public <T> T createService(Class<T> serviceClass, String baseUrl){
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.client(new OkHttpClient.Builder().build())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build();
return retrofit.create(serviceClass);
}
public Function<Response<ResponseBody>, Observable<File>> processResponse(){
return new Function<Response<ResponseBody>, Observable<File>>() {
@Override
public Observable<File> apply(Response<ResponseBody> responseBodyResponse) throws Exception {
return saveToDiskRx(responseBodyResponse);
}
};
}
private Observable<File> saveToDiskRx(final Response<ResponseBody> response){
return Observable.create(new ObservableOnSubscribe<File>() {
@Override
public void subscribe(ObservableEmitter<File> subscriber) throws Exception {
String header = response.headers().get("Content-Disposition");
String filename = header.replace("attachment; filename=", "");
new File("/data/data/" + getPackageName() + "/images").mkdir();
File destinationFile = new File("/data/data/" + getPackageName() + "/images/" + filename);
BufferedSink bufferedSink = Okio.buffer(Okio.sink(destinationFile));
bufferedSink.writeAll(response.body().source());
bufferedSink.close();
subscriber.onNext(destinationFile);
subscriber.onComplete();
}
});
}
private Observer<File> handleResult(){
return new Observer<File>() {
@Override
public void onSubscribe(Disposable d) {
Log.d("OnSubscribe", "OnSubscribe");
}
@Override
public void onNext(File file) {
Log.d("OnNext", "File downloaded to " + file.getAbsolutePath());
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
Log.d("Error", "Error " + e.getMessage());
}
@Override
public void onComplete() {
Log.d("OnComplete", "onCompleted");
}
};
}
}
J'ai essayé d'ajouter l'Appel comme mentionné ici de sorte qu'il ressemble:
Call<Observable<Response<ResponseBody>>> downloadFileByUrlRx(@Url String fileUrl);
toutefois, cela provoque des problèmes avec la flatMap fonctionner comme il ne trouve pas le symbole de la méthode flatMap(Fonction< Réponse< ResponseBody>,Observables< Fichier>>).
source d'informationauteur khe11e
Vous devez vous connecter pour publier un commentaire.
Vous utilisez RxJava1 adaptateur pour la Rénovation, de la remplacer par RxJava2 variante:
Mise à JOUR
De départ avec la Rénovation de la version
2.2.0
il y a une première partie l'appel de l'adaptateur pour RxJava2:Pour les nouveaux arrivants (juillet/2017) :
Vous avez foiré votre version de bibliothèque pour vous.
J'ai été en utilisant la dernière version de RXAndroid 2.0.1
1) assurez-vous que vous disposez des mêmes Modernisation et Rénovation-RxJava Cartes.
2) l'Utilisation de la compilation
pas
et l'utilisation
RxJava2CallAdapterFactory.create()
au lieu deRxJavaCallAdapterFactory.create()
tout de modernisation des bâtiments.Mise À Jour : Novembre/2017
Rxjava version est mise à jour à 2.1.5
Puisque vous utilisez l'en-tête de réponse, afin de remplacer
ResponseBody
àObject
partout.