RxAndroid und Retrofit: Der Anrufadapter kann nicht für io.reactivex.Observable <retrofit2.Response <okhttp3.ResponseBody >> erstellt werden

Ich versuche, rxJava, rxAndroid, Retrofit2 und OkHTTP3 zu verwenden, um eine Datei von einem URL-Endpunkt herunterzuladen. Mein Code ist nicht in der Lage, den Anrufadapter für ein "Observable <retrofit2.Response <okhttp3.ResponseBody >>" zu erstellen. Diese Methoden sind neu für mich, also glaube ich, dass mir hier ein wichtiges Konzept fehlt. Jede Richtung oder Punkte wird sehr geschätzt.

FATAL EXCEPTION: main Prozess: com.example.khe11e.rxdownloadfile, PID: 14130 java.lang.IllegalArgumentException: Anrufadapter für io.reactivex.Observable nicht erstellen> für Methode RetrofitInterface.downloadFileByUrlRx bei retrofit2.ServiceMethod $ Builder.methodError (ServiceMethod .java: 720) bei retrofit2.ServiceMethod $ Builder.createCallAdapter (ServiceMethod.java:234) bei retrofit2.ServiceMethod $ Builder.build (ServiceMethod.java:160) bei retrofit2.Retrofit.loadServiceMethod (Retrofit.java:166) bei retrofit2 .Retrofit $ 1.invoke (Retrofit.java:145) bei java.lang.reflect.Proxy.invoke (Proxy.java:393) bei $ Proxy0.downloadFileByUrlRx (Unbekannte Quelle) bei com.example.khe11e.rxdownloadfile.MainActivity.downloadImage (MainActivity.java:46) bei com.example.khe11e.rxdownloadfile.MainActivity $ 1.onClick (MainActivity.java:39) bei android.view.View.performClick (View.java:5207) bei android.view.View $ PerformClick .run (View.java:21168) bei android.os.Handler.handleCallback (Handler.java:746) bei android.os.Handler.dispatchMe Ssage (Handler.java:95) bei android.os.Looper.loop (Looper.java:148) bei android.app.ActivityThread.main (ActivityThread.java:5491) bei java.lang.reflect.Method.invoke (Native Methode) bei com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:728) bei com.android.internal.os.ZygoteInit.main (ZygoteInit.java:618) Verursacht durch: java.lang.IllegalArgumentException : Anrufadapter für io.reactivex.Observable> konnte nicht gefunden werden. (Retrofit.java:237) bei retrofit2.Retrofit.callAdapter (Retrofit.java:201) bei retrofit2.ServiceMethod $ Builder.createCallAdapter (ServiceMethod .java: 232) … 16 mehr

  • Eine Audio-Loop auf Android machen
  • Wie kann ich einen Service-Neustart erzwingen?
  • Ist dies ein richtiger Weg, um Dagger 2 für Android App im Unit-Test zu verwenden, um Abhängigkeiten mit Mocks / Fakes zu überschreiben?
  • Wie komme ich zur Befehlszeile in Eclipse
  • Rufen Sie die Hardware-Back-Taste programmgesteuert auf?
  • Decodieren von Video mit FFMpeg für Android
  • Build.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"); } }; } } 

    Ich habe versucht Hinzufügen von Call wie hier erwähnt , so sieht es wie:

     Call<Observable<Response<ResponseBody>>> downloadFileByUrlRx(@Url String fileUrl); 

    Dies verursacht jedoch Probleme mit der flatMap-Funktion, da sie die Symbolmethode flatMap nicht finden kann (Funktion <Response <ResponseBody>, Observable <File >>).

  • Ist es möglich, die Aktionsleisten-Registerkarte programmgesteuert zu ändern
  • Ist es möglich, schreibgeschützten Zugriff auf eine sqlite-Datenbank in einem apk zu erhalten?
  • Gibt es eine Möglichkeit, die R.java-Datei in Android Studio zu generieren?
  • Wie platziere ich PDF in Android
  • Haben Sie TextView Skala seine Schriftgröße, um Eltern zu füllen?
  • Kundenspezifische Zeichnung auf Mapbox Karte Leinwand
  • 3 Solutions collect form web for “RxAndroid und Retrofit: Der Anrufadapter kann nicht für io.reactivex.Observable <retrofit2.Response <okhttp3.ResponseBody >> erstellt werden”

    Sie verwenden RxJava 1 Adapter für Retrofit, ersetzen Sie es mit RxJava 2 Variante:

     //compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0' compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0' 

    AKTUALISIEREN

    Beginnend mit Retrofit Version 2.2.0 gibt es einen First-Party Anrufadapter für RxJava2:

     compile 'com.squareup.retrofit2:retrofit:2.2.0' compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0' 

    Für Neuankömmlinge (Juli / 2017):

    Sie haben Ihre Bibliotheksversion sicher verraten.

    Ich habe die neueste Version von RXAndroid 2.0.1 benutzt

     compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'io.reactivex.rxjava2:rxjava:2.1.0' compile 'com.squareup.retrofit2:retrofit:2.3.0' compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' 

    1) Vergewissern Sie sich, dass Sie dieselben Retrofit- und Retrofit-RxJava-Adapter haben.

    2) Verwenden Sie kompilieren

     compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' 

    nicht

     compile 'com.squareup.retrofit2:adapter-rxjava:2.3.0' 

    Da Sie Response-Header verwenden, ersetzen Sie ResponseBody auf Object überall.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.