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