Tôi sẽ gửi một phương thức nhận đơn giản đến máy chủ của tôi (đó là ứng dụng Rails) và nhận kết quả bằng RxJava và Retrofit. Điều mà tôi đã làm là:
Giao diện của tôi:
public interface ApiCall {
String SERVICE_ENDPOINT = "https://198.50.214.15";
@GET("/api/post")
io.reactivex.Observable<Post> getPost();
}
Mô hình của tôi là:
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;
}
}
Và đây là những gì tôi đã làm trong hoạt động của mình:
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();
});
}
}
Tôi không biết tại sao tôi gặp lỗi này, thông báo rằng tôi có vấn đề với bộ điều hợp. Tôi cũng bao gồm bộ điều hợp vào 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
Đây là phần phụ thuộc Gradle của tôi:
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'
}