Unable to create call adapter for io.reactivex.Observable

匿名 (未验证) 提交于 2019-12-03 02:54:01

问题:

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

回答1:

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


回答2:

I ran into the same issue. Instead of adding new repositories you can add dependency for Jake Wharton's library:

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

Then you can add factory:

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

The fact that adapter has version 2.. does not mean that it is intended for use with RxJava 2, as I thought.

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


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!