Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to create call adapter for io.reactivex.Observable

I'm going to send a simple get method to my server(it is Rails app) and get the result using RxJava and Retrofit. The thing that I did is:

My interface:

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

My model is this:

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;     }  } 

And this is what I did in my activity:

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();                 });      } } 

I don't know why I get this error which says I have problem with adapter. I also included the adapter into the 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 

This is my Gradle dependency:

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'  } 
like image 885
Hussein Ojaghi Avatar asked Apr 16 '17 05:04

Hussein Ojaghi


People also ask

Is there a first-party call adapter for rxjava2?

Starting with Retrofit version 2.2.0 there is a first-party call adapter for RxJava2: Show activity on this post. RxJava3CallAdapterFactory.create () instead of RxJava2CallAdapterFactory.create ()

Why is my retrofit object not working in RxJava?

Otherwise your issue is likely because there is no Call adapter added when instantiating your Retrofit object. For example, for RxJava2, you can include a call adapter by adding this line while building it. Thanks for contributing an answer to Stack Overflow!

Why is my retrofit object not instantiating?

This will solve the problem. Otherwise your issue is likely because there is no Call adapter added when instantiating your Retrofit object. For example, for RxJava2, you can include a call adapter by adding this line while building it. Thanks for contributing an answer to Stack Overflow!


1 Answers

You need to tell Retrofit that you want to use RxJava 2, using:

addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 

So, for creating your Retrofit object, you will have something like:

Retrofit retrofit = new Retrofit.Builder()     .baseUrl(SERVICE_ENDPOINT)     .addCallAdapterFactory(RxJava2CallAdapterFactory.create())     .build(); 
like image 88
GVillani82 Avatar answered Oct 06 '22 15:10

GVillani82