2017-04-16 11 views
26

के लिए कॉल एडाप्टर बनाने में असमर्थ मैं अपने सर्वर (यह रेल ऐप है) को एक सरल विधि विधि भेजने जा रहा है और परिणाम RxJava और Retrofit का उपयोग कर प्राप्त कर रहा हूं। बात यह है कि मैंने किया है:io.reactivex.Observable

मेरे इंटरफ़ेस:

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 निर्भरता है: मैं भी 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' 

} 

उत्तर

62

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

addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 

तो, Retrofit ऑब्जेक्ट बनाने के लिए, आपके पास कुछ ऐसा होगा:

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

धन्यवाद लेकिन एक और समस्या यह है कि मैं पाने के लिए मेरे यूआरएल के बारे में है यह कहना है ---> /198.50.214.15:80 – Sandro

+0

को http://198.50.214.15/ मैं इस .baseUrl करने के लिए बदल ("कनेक्ट करने में विफल ") लेकिन मुझे अभी भी वही त्रुटि मिलती है – Sandro

+0

मैं url – Sandro

16

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

compile '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 के साथ उपयोग के लिए।

compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0' 
+0

यह अच्छा जवाब है –

+0

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

+0

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