Io.reactivex.Observable के लिए कॉल एडाप्टर बनाने में असमर्थ


94

मैं अपने सर्वर पर एक सरल विधि प्राप्त करने जा रहा हूं (यह Rails app है) और 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

यह मेरी ग्रेडेल निर्भरता है:

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'

}

जवाबों:


219

आपको रिट्रॉफ़िट बताने की ज़रूरत है कि आप RxJava 2 का उपयोग करना चाहते हैं,

addCallAdapterFactory(RxJava2CallAdapterFactory.create())

तो, अपनी Retrofitवस्तु बनाने के लिए , आपके पास कुछ ऐसा होगा:

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

धन्यवाद, लेकिन एक और समस्या जो मुझे मिलती है वह है मेरे url के बारे में यह कहता है ---> /198.50.214.15:80 से कनेक्ट करने में विफल
हुसैन ओजागी

मैंने इसे बदल दिया है .baseUrl ("198.50.214.15/ " ) लेकिन मुझे अभी भी वही त्रुटि
मिली है

4
यहाँ RxJava2CallAdapterFactory अंदर पुस्तकालय के साथ लिंक है: github.com/square/retrofit/tree/master/retrofit-adapters/…
चक

ऊ, वू। बहुत बहुत धन्यवाद।
VipPunkJoshers Droopy

72

मैं उसी मुद्दे में भाग गया। नई रिपॉजिटरी जोड़ने के बजाय आप जेक व्हार्टन के पुस्तकालय की निर्भरता जोड़ सकते हैं:

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 है .. इसका मतलब यह नहीं है कि यह आरएक्सजवा 2 के साथ उपयोग करने के लिए है, जैसा कि मैंने सोचा था।

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

@ShaktisinhJadeja धन्यवाद आदमी, अच्छा लगा कि मैं आपकी मदद के लिए था
राउत दरपन

7
आपको com.squareup.retrofit2: अनुकूलक-rxjava2 का उपयोग करने की आवश्यकता है। ध्यान दें कि आप 2 को याद कर रहे हैं :)
dleal

RxJava2CallAdapterFactory अब और इस्तेमाल नहीं किया जाता है - अभी RxJavaCallAdapterFactory सभी का समर्थन करता है
कोनराड

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

आपकी दोनों ग्रेड प्रविष्टियां समान हैं?
नदीम शुकूर

मैंने rxjava को बदल दिया है: 2.4.0 को rxjava2: 2.4.0
Anudeep
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.