ไม่สามารถสร้าง call adapter สำหรับ io.reactivex.Observable


98

ฉันจะส่งเมธอด get ง่ายๆไปยังเซิร์ฟเวอร์ของฉัน (มันคือแอพ Rails) และรับผลลัพธ์โดยใช้ RxJava และ Retrofit สิ่งที่ฉันทำคือ:

อินเทอร์เฟซของฉัน:

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

โมเดลของฉันคือ:

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

}

และนี่คือสิ่งที่ฉันทำในกิจกรรมของฉัน:

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

    }
}

ฉันไม่รู้ว่าทำไมฉันถึงได้รับข้อผิดพลาดนี้ซึ่งบอกว่าฉันมีปัญหากับอะแดปเตอร์ ฉันยังรวมอะแดปเตอร์ไว้ในแผ่นรอง:

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

นี่คือการพึ่งพา Gradle ของฉัน:

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'

}

คำตอบ:


228

คุณต้องบอก Retrofit ว่าคุณต้องการใช้ RxJava 2 โดยใช้:

addCallAdapterFactory(RxJava2CallAdapterFactory.create())

ดังนั้นในการสร้างRetrofitวัตถุของคุณคุณจะมีสิ่งต่างๆดังนี้:

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

ขอบคุณ แต่ปัญหาอีกอย่างที่ฉันได้รับคือเกี่ยวกับ url ของฉันมันบอกว่า ---> ไม่สามารถเชื่อมต่อกับ /198.50.214.15:80
Hussein Ojaghi

ฉันเปลี่ยนเป็น .baseUrl (" 198.50.214.15/" ) แต่ฉันยังคงได้รับข้อผิดพลาดเดิม
Hussein Ojaghi

4
นี่คือลิงค์ไปยังไลบรารีกับ RxJava2CallAdapterFactory ภายใน: github.com/square/retrofit/tree/master/retrofit-adapters/…
Chuck

โอววว. ขอบคุณมาก.
VipPunkJoshers Droopy

72

ฉันพบปัญหาเดียวกัน แทนที่จะเพิ่มที่เก็บใหม่คุณสามารถเพิ่มการพึ่งพาไลบรารีของ Jake Wharton:

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

จากนั้นคุณสามารถเพิ่มโรงงาน:

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

การที่อแดปเตอร์มีเวอร์ชั่น 2 .. ไม่ได้หมายความว่าจะมีไว้สำหรับใช้กับ RxJava 2 อย่างที่คิด

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

@ShaktisinhJadeja ขอบคุณผู้ชายรู้สึกดีที่ฉันได้รับความช่วยเหลือจากคุณ
Raut Darpan

7
คุณต้องใช้ com.squareup.retrofit2: adapter-rxjava2 สังเกตว่าคุณพลาด 2 :)
dleal

RxJava2CallAdapterFactory ไม่ได้ใช้อีกต่อไป - ตอนนี้ RxJavaCallAdapterFactory รองรับทั้งหมด
Konrad Krakowiak

13

ปัญหาอยู่ที่ห้องสมุดที่ใช้

ฉันได้เปลี่ยน

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

ด้วย

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

และใช้

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

เกรดของคุณทั้งสองรายการเหมือนกันไหม
Nadeem Shukoor

ฉันได้แทนที่ rxjava: 2.4.0 ด้วย rxjava2: 2.4.0
Anudeep
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.