2016-03-03 9 views
7

मैं रेट्रोफिट 2 (बीटा 4) का उपयोग कर रहा हूं, और मैं RxAndroid Observable प्रतिक्रिया के मानक Call प्रतिक्रिया का उपयोग करने से आगे बढ़ रहा था। मैं Call<List<ExampleObject>> से Observable<List<ExampleObject>> से एक साधारण स्वैप के साथ अपनी अधिकांश कॉल स्विच करने में सफल रहा था। मेरे कॉल के कुछ Call<okhttp3.ResponseBody> है, जो अच्छा काम करता है, लेकिन जब मैं Call बदली, मैं एक त्रुटि का सामना करना पड़ा का उपयोग करें:RxAndroid और Retrofit 2 के साथ प्रतिक्रिया शरीर को कैसे प्राप्त करें?

03-03 15:21:44.237 27333-27333/com.example.app E/AndroidRuntime: FATAL EXCEPTION: main 
     Process: com.example.app, PID: 27333 
     java.lang.IllegalArgumentException: Unable to create call adapter for rx.Observable<okhttp3.ResponseBody> 
      for method AuthenticationService.getLoginForm 
      at retrofit2.Utils.methodError(Utils.java:119) 
      at retrofit2.MethodHandler.createCallAdapter(MethodHandler.java:52) 
      at retrofit2.MethodHandler.create(MethodHandler.java:25) 
      at retrofit2.Retrofit.loadMethodHandler(Retrofit.java:164) 
      at retrofit2.Retrofit$1.invoke(Retrofit.java:145) 
      at java.lang.reflect.Proxy.invoke(Proxy.java:393) 
      at $Proxy6.getLoginForm(Unknown Source) 
      at com.example.app.ui.fragment.LoginFragment.login(LoginFragment.java:214) 
      at com.example.app.ui.fragment.LoginFragment.lambda$onContinue$1(LoginFragment.java:168) 
      at com.example.app.ui.fragment.LoginFragment.access$lambda$1(LoginFragment.java) 
      at com.example.app.ui.fragment.LoginFragment$$Lambda$4.onClick(Unknown Source) 
      at android.view.View.performClick(View.java:5204) 
      at android.view.View$PerformClick.run(View.java:21153) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:148) 
      at android.app.ActivityThread.main(ActivityThread.java:5417) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
     Caused by: java.lang.IllegalArgumentException: Could not locate call adapter for rx.Observable<okhttp3.ResponseBody>. 
     Tried: 
      * retrofit2.ExecutorCallAdapterFactory 
      at retrofit2.Retrofit.nextCallAdapter(Retrofit.java:230) 
      at retrofit2.Retrofit.callAdapter(Retrofit.java:194) 
      at retrofit2.MethodHandler.createCallAdapter(MethodHandler.java:50) 
       ... 18 more 

कारण मैं ResponseBody उपयोग कर रहा हूँ हमेशा की तरह किसी अन्य वस्तु के बजाय, है क्योंकि इन मामलों में मुझे HTML को पार्स करने की आवश्यकता है, और जहां तक ​​मुझे पता है, HTML पार्सर के लिए कोई रेट्रोफिट कनवर्टर नहीं है। मुझे पता है कि मैं शायद अपने आप को एक बना सकता हूं, लेकिन मैं HTML की छोटी मात्रा के लिए नहीं बल्कि मुझे पार्स करना होगा।

मेरा सवाल यह है कि रेट्रोफिट 2 आरएक्सजेवा एडाप्टर ResponseBody का समर्थन क्यों नहीं करता है जब रेट्रोफिट 2 स्वयं करता है? क्या कोई और तरीका है कि मैं Observable से प्रतिक्रिया स्ट्रिंग प्राप्त कर सकता हूं?


मेरे सेवा:

public interface AuthenticationService() { 

    @GET("cas/login") 
    Observable<Response<ResponseBody>> login(); 
} 

प्रासंगिक रेट्रोफिट कोड:

public static Retrofit getRetrofit() { 
    if(mRetrofit == null) { 
     return new Retrofit.Builder() 
       .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
       .addConverterFactory(GsonConverterFactory.create(getGson())) 
       .client(getOkHttpClient()) 
       .build(); 
    } return mRetrofit; 
} 

public static AuthenticationService getAuthenticationService() { 
    return getRetrofit().create(AuthenticationService.class); 
} 

रिस्पांस प्रयास:

private void login() { 
    RestClient.getAuthenticationService().login() 
      .observeOn(ASchedulers.newThread()) 
      .subscribeOn(AndroidSchedulers.mainThread()) 
      .doOnNext(this::onLoginResponse); 
} 

private void onLoginResponse(Response<ResponseBody>> response) { 
    try { 
     parseResponse(response.body().string()); 
    } catch (IOException) { 
     Timber.w(throwable, "Failed to login"); 
    } 
} 

नई स्टैक ट्रेस: ​​

इस तरह
03-03 16:14:57.848 26866-26866/com.example.app E/AndroidRuntime: FATAL EXCEPTION: main 
     Process: com.example.app, PID: 26866 
     java.lang.IllegalArgumentException: Unable to create call adapter for rx.Observable<retrofit2.Response<okhttp3.ResponseBody>> 
      for method AuthenticationService.getLoginForm 
      at retrofit2.Utils.methodError(Utils.java:119) 
      at retrofit2.MethodHandler.createCallAdapter(MethodHandler.java:52) 
      at retrofit2.MethodHandler.create(MethodHandler.java:25) 
      at retrofit2.Retrofit.loadMethodHandler(Retrofit.java:164) 
      at retrofit2.Retrofit$1.invoke(Retrofit.java:145) 
      at java.lang.reflect.Proxy.invoke(Proxy.java:393) 
      at $Proxy3.getLoginForm(Unknown Source) 
      at com.example.app.ui.fragment.LoginFragment.login(LoginFragment.java:206) 
      at com.example.app.ui.fragment.LoginFragment.lambda$onContinue$1(LoginFragment.java:160) 
      at com.example.app.ui.fragment.LoginFragment.access$lambda$1(LoginFragment.java) 
      at com.example.app.ui.fragment.LoginFragment$$Lambda$4.onClick(Unknown Source) 
      at android.view.View.performClick(View.java:5204) 
      at android.view.View$PerformClick.run(View.java:21153) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:148) 
      at android.app.ActivityThread.main(ActivityThread.java:5417) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
     Caused by: java.lang.IllegalArgumentException: Could not locate call adapter for rx.Observable<retrofit2.Response<okhttp3.ResponseBody>>. 
     Tried: 
      * retrofit2.ExecutorCallAdapterFactory 
      at retrofit2.Retrofit.nextCallAdapter(Retrofit.java:230) 
      at retrofit2.Retrofit.callAdapter(Retrofit.java:194) 
      at retrofit2.MethodHandler.createCallAdapter(MethodHandler.java:50) 
       ... 18 more 
+1

वास्तविक कोड पोस्ट करें। –

+0

@TudorLuca कोड – Bryan

+0

@TudorLuca के साथ अपडेट किया गया है मुझे अपना समय बर्बाद करने के लिए खेद है। मुझे पता चला कि मैं वास्तव में एक रेट्रोफिट ऑब्जेक्ट का उपयोग कर रहा था (जिसे मुझे हटा दिया जाना चाहिए) जिसमें RxJavaCallAdapterFactory नहीं था। मैं वर्तमान कोड को अलग कर रहा हूं, और यह एक गड़बड़ है। वैसे भी आपकी मदद के लिए धन्यवाद। – Bryan

उत्तर

16

कोशिश कुछ:

import okhttp3.ResponseBody; 
import retrofit2.Response; 

@GET("/whatever") 
Observable<Response<ResponseBody>> getWhatever(); 

संपादित: भूल जाते हैं आप RxJava के लिए एडाप्टर निर्दिष्ट करने के लिए नहीं है:

new Retrofit.Builder() 
      ... 
      .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
      .build() 
      .create(Api.class); 
+0

ने कोशिश की, वही परिणाम:/मैंने एक सादा 'okhttp3.Respone' भी कोशिश की, जो कि काम नहीं करता है। – Bryan

+0

हां, मेरे पास 'RxJavaCallAdapterFactory' सही तरीके से स्थापित है, क्योंकि मेरे अन्य 'अवलोकन योग्य ' प्रतिक्रियाएं अपेक्षित कार्य करती हैं। – Bryan

+2

यह okhttp3 के साथ काम नहीं करेगा। रीस्पोन, आपको रेट्रोफिट के प्रतिक्रिया की आवश्यकता है। –

संबंधित मुद्दे