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