Tidak dapat membuat adaptor panggilan untuk io.reactivex.Observable


94

Saya akan mengirim metode get sederhana ke server saya (ini adalah aplikasi Rails) dan mendapatkan hasilnya menggunakan RxJava dan Retrofit. Hal yang saya lakukan adalah:

Antarmuka saya:

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

Model saya adalah ini:

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

}

Dan inilah yang saya lakukan dalam aktivitas saya:

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

    }
}

Saya tidak tahu mengapa saya mendapatkan kesalahan ini yang mengatakan saya memiliki masalah dengan adaptor. Saya juga menyertakan adaptor ke dalam 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

Ini adalah ketergantungan Gradle saya:

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'

}

Jawaban:


219

Anda perlu memberi tahu Retrofit bahwa Anda ingin menggunakan RxJava 2, menggunakan:

addCallAdapterFactory(RxJava2CallAdapterFactory.create())

Jadi, untuk membuat Retrofitobjek Anda, Anda akan memiliki sesuatu seperti:

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

terima kasih tetapi masalah lain yang saya dapatkan adalah tentang url saya yang mengatakan ---> Gagal terhubung ke /198.50.214.15:80
Hussein Ojaghi

Saya mengubah ini .baseUrl (" 198.50.214.15/" ) tetapi saya masih mendapatkan kesalahan yang sama
Hussein Ojaghi

4
Berikut ini tautan ke perpustakaan dengan RxJava2CallAdapterFactory di dalam: github.com/square/retrofit/tree/master/retrofit-adapters/…
Chuck

Ooo, woo. Terima kasih banyak.
VipPunkJoshers Droopy

72

Saya mengalami masalah yang sama. Daripada menambahkan repositori baru, Anda dapat menambahkan dependensi pustaka Jake Wharton:

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

Kemudian Anda dapat menambahkan pabrik:

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

Fakta bahwa adaptor memiliki versi 2 .. tidak berarti bahwa ini dimaksudkan untuk digunakan dengan RxJava 2, seperti yang saya duga.

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

@ShaktisinhJadeja terima kasih kawan, merasa senang karena saya membantu Anda
Raut Darpan

7
Anda perlu menggunakan com.squareup.retrofit2: adapter-rxjava2. Perhatikan bahwa Anda melewatkan 2 :)
dleal

RxJava2CallAdapterFactory tidak digunakan lagi - sekarang RxJavaCallAdapterFactory mendukung semua
Konrad Krakowiak

13

Masalahnya adalah dengan perpustakaan yang digunakan.

Saya telah mengganti

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

dengan

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

dan digunakan

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

kedua entri kelas Anda sama?
Nadeem Shukoor

Saya telah mengganti rxjava: 2.4.0 dengan rxjava2: 2.4.0
Anudeep
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.