Không thể tạo bộ điều hợp cuộc gọi cho io.reactivex.Observable


94

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'

}

Câu trả lời:


219

Bạn cần cho Retrofit biết rằng bạn muốn sử dụng RxJava 2 bằng cách sử dụng:

addCallAdapterFactory(RxJava2CallAdapterFactory.create())

Vì vậy, để tạo Retrofitđối tượng của bạn , bạn sẽ có một cái gì đó như:

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

cảm ơn, nhưng một vấn đề khác mà tôi nhận được là khoảng url của tôi nó nói ---> Không thể kết nối với /198.50.214.15:80
Hussein Ojaghi

Tôi đã thay đổi thành .baseUrl này (" 198.50.214.15/" ) nhưng tôi vẫn gặp lỗi tương tự
Hussein Ojaghi

4
Đây là liên kết đến thư viện với RxJava2CallAdapterFactory bên trong: github.com/square/retrofit/tree/master/retrofit-adapters/…
Chuck

Ồ, ồ. Cảm ơn rất nhiều.
VipPunkJoshers Droopy

72

Tôi gặp phải vấn đề tương tự. Thay vì thêm các kho mới, bạn có thể thêm phần phụ thuộc vào thư viện của Jake Wharton:

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

Sau đó, bạn có thể thêm nhà máy:

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

Thực tế là bộ điều hợp có phiên bản 2 .. không có nghĩa là nó được thiết kế để sử dụng với RxJava 2, như tôi nghĩ.

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

@ShaktisinhJadeja cảm ơn anh bạn, cảm thấy rất vui vì tôi đã được sự giúp đỡ của bạn
Raut Darpan ngày

7
Bạn cần sử dụng com.squareup.retrofit2: adapter-rxjava2. Lưu ý rằng bạn đang thiếu 2 :)
dleal

RxJava2CallAdapterFactory không được sử dụng nữa - hỗ trợ ngay bây giờ RxJavaCallAdapterFactory tất cả
Konrad Krakowiak

13

Vấn đề là với thư viện đang được sử dụng.

Tôi đã thay thế

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

với

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

và đã sử dụng

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

cả hai mục nhập của bạn đều giống nhau?
Nadeem Shukoor

Tôi đã thay thế rxjava: 2.4.0 bằng rxjava2: 2.4.0
Anudeep
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.