retrofit rx-java retrofit2 rx-android rx-java2

retrofit - No se puede crear el adaptador de llamadas para io.reactivex.Observable



rx-java retrofit2 (3)

Debe decirle a Retrofit que desea usar RxJava 2, usando:

addCallAdapterFactory(RxJava2CallAdapterFactory.create())

Entonces, para crear su objeto Retrofit , tendrá algo como:

Retrofit retrofit = new Retrofit.Builder() .baseUrl(SERVICE_ENDPOINT) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build();

Enviaré un método get simple a mi servidor (es la aplicación Rails) y obtendré el resultado usando RxJava y Retrofit. Lo que hice es:

Mi interfaz:

public interface ApiCall { String SERVICE_ENDPOINT = "https://198.50.214.15"; @GET("/api/post") io.reactivex.Observable<Post> getPost(); }

Mi modelo es este:

public class Post { @SerializedName("id") private String id; @SerializedName("body") private String body; @SerializedName("title") private String title; public String getId () { return id; } public String getBody () { return body; } public String getTitle () { return title; } }

Y esto es lo que hice en mi actividad:

public class Javax extends AppCompatActivity { RecyclerView rvListContainer; postAdapter postAdapter; List<String> messageList=new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_javax); rvListContainer=(RecyclerView)findViewById(R.id.recyclerView); postAdapter=new postAdapter(messageList); rvListContainer.setAdapter(postAdapter); } @Override protected void onResume() { super.onResume(); Retrofit retrofit=new Retrofit.Builder() .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .baseUrl("https://198.50.214.15") .build(); ApiCall apiService=retrofit.create(ApiCall.class); Observable<Post> observable=apiService.getPost(); observable.subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(responseData -> { messageList.add(responseData.getTitle()); postAdapter.notifyDataSetChanged(); }); } }

No sé por qué recibo este error que dice que tengo un problema con el adaptador. También incluí el adaptador en el gradle:

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.hussein.sqlitedatabase, PID: 19445 java.lang.RuntimeException: Unable to resume activity {com.example.hussein.sqlitedatabase/com.example.hussein.sqlitedatabase.Javax}: java.lang.IllegalArgumentException: Unable to create call adapter for io.reactivex.Observable<com.example.hussein.sqlitedatabase.Post> for method ApiCall.getPost at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2964) at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2993) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2395) at android.app.ActivityThread.access$800(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321) at android.os.Handler.dispatchMessage(Handler.java:110) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:5292) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.IllegalArgumentException: Unable to create call adapter for io.reactivex.Observable<com.example.hussein.sqlitedatabase.Post> for method ApiCall.getPost at retrofit2.ServiceMethod$Builder.methodError(ServiceMethod.java:751) at retrofit2.ServiceMethod$Builder.createCallAdapter(ServiceMethod.java:236) at retrofit2.ServiceMethod$Builder.build(ServiceMethod.java:161) at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:169) at retrofit2.Retrofit$1.invoke(Retrofit.java:146) at $Proxy0.getPost(Native Method) at com.example.hussein.sqlitedatabase.Javax.onResume(Javax.java:42) at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1197) at android.app.Activity.performResume(Activity.java:5343) at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2950) ... 12 more Caused by: java.lang.IllegalArgumentException: Could not locate call adapter for io.reactivex.Observable<com.example.hussein.sqlitedatabase.Post>. Tried: * retrofit2.adapter.rxjava.RxJavaCallAdapterFactory * retrofit2.ExecutorCallAdapterFactory at retrofit2.Retrofit.nextCallAdapter(Retrofit.java:240) at retrofit2.Retrofit.callAdapter(Retrofit.java:204) at retrofit2.ServiceMethod$Builder.createCallAdapter(ServiceMethod.java:234) ... 20 more

Esta es mi dependencia de Gradle:

dependencies { compile fileTree(dir: ''libs'', include: [''*.jar'']) androidTestCompile(''com.android.support.test.espresso:espresso-core:2.2.2'', { exclude group: ''com.android.support'', module: ''support-annotations'' }) compile ''com.android.support.constraint:constraint-layout:1.0.2'' compile ''com.android.support:appcompat-v7:25.3.1'' testCompile ''junit:junit:4.12'' compile ''com.squareup.retrofit2:retrofit:2.2.0'' compile ''com.android.support:recyclerview-v7:25.3.1'' compile ''com.android.support:design:25.3.1'' compile ''io.reactivex.rxjava2:rxandroid:2.0.1'' compile ''io.reactivex.rxjava2:rxjava:2.0.1'' compile ''com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'' compile ''com.squareup.retrofit2:adapter-rxjava:2.0.2'' compile ''com.squareup.retrofit2:converter-gson:2.0.0'' compile ''com.google.code.gson:gson:2.4'' }


El problema es con la biblioteca que se está utilizando.

Tengo reemplaza

implementation ''com.squareup.retrofit2:adapter-rxjava:2.4.0''

con

implementation ''com.squareup.retrofit2:adapter-rxjava2:2.4.0''

y usado

Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL).client(client) .addConverterFactory(GsonConverterFactory.create(gson)) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build();


Me encontré con el mismo problema. En lugar de agregar nuevos repositorios, puede agregar la dependencia de la biblioteca de Jake Wharton:

implementation ''com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0''

Entonces puedes agregar fábrica:

Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.example.com") .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build();

El hecho de que el adaptador tenga la versión 2 ... no significa que esté diseñado para usarse con RxJava 2, como pensé.

implementation ''com.squareup.retrofit2:adapter-rxjava:2.1.0''