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' }
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 ()
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!
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!
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();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With