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'

}
Hussein Ojaghi
sumber

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();
GVillani82
sumber
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'
Raut Darpan
sumber
@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();
Anudeep
sumber
kedua entri kelas Anda sama?
Nadeem Shukoor
Saya telah mengganti rxjava: 2.4.0 dengan rxjava2: 2.4.0
Anudeep