如何使用RxAndroid和Retrofit 2检索响应体?

前端之家收集整理的这篇文章主要介绍了如何使用RxAndroid和Retrofit 2检索响应体?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用Retrofit 2(beta 4),我希望从使用标准的Call响应转向Rx Android Observable响应.我通过Call< List< ExampleObject>>的简单交换成功切换了我的大多数调用.到Observable< List< ExampleObject>>.我的一些电话使用Call< okhttp3.ResponseBody>,这很好用,但当我换掉Call时,我遇到了一个错误
  1. 03-03 15:21:44.237 27333-27333/com.example.app E/AndroidRuntime: FATAL EXCEPTION: main
  2. Process: com.example.app,PID: 27333
  3. java.lang.IllegalArgumentException: Unable to create call adapter for rx.Observable<okhttp3.ResponseBody>
  4. for method AuthenticationService.getLoginForm
  5. at retrofit2.Utils.methodError(Utils.java:119)
  6. at retrofit2.MethodHandler.createCallAdapter(MethodHandler.java:52)
  7. at retrofit2.MethodHandler.create(MethodHandler.java:25)
  8. at retrofit2.Retrofit.loadMethodHandler(Retrofit.java:164)
  9. at retrofit2.Retrofit$1.invoke(Retrofit.java:145)
  10. at java.lang.reflect.Proxy.invoke(Proxy.java:393)
  11. at $Proxy6.getLoginForm(Unknown Source)
  12. at com.example.app.ui.fragment.LoginFragment.login(LoginFragment.java:214)
  13. at com.example.app.ui.fragment.LoginFragment.lambda$onContinue$1(LoginFragment.java:168)
  14. at com.example.app.ui.fragment.LoginFragment.access$lambda$1(LoginFragment.java)
  15. at com.example.app.ui.fragment.LoginFragment$$Lambda$4.onClick(Unknown Source)
  16. at android.view.View.performClick(View.java:5204)
  17. at android.view.View$PerformClick.run(View.java:21153)
  18. at android.os.Handler.handleCallback(Handler.java:739)
  19. at android.os.Handler.dispatchMessage(Handler.java:95)
  20. at android.os.Looper.loop(Looper.java:148)
  21. at android.app.ActivityThread.main(ActivityThread.java:5417)
  22. at java.lang.reflect.Method.invoke(Native Method)
  23. at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
  24. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
  25. Caused by: java.lang.IllegalArgumentException: Could not locate call adapter for rx.Observable<okhttp3.ResponseBody>.
  26. Tried:
  27. * retrofit2.ExecutorCallAdapterFactory
  28. at retrofit2.Retrofit.nextCallAdapter(Retrofit.java:230)
  29. at retrofit2.Retrofit.callAdapter(Retrofit.java:194)
  30. at retrofit2.MethodHandler.createCallAdapter(MethodHandler.java:50)
  31. ... 18 more
@H_502_4@之所以我像往常一样使用ResponseBody而不是另一个对象,是因为在这些情况下我需要解析HTML,据我所知,HTML解析器没有Retrofit转换器.我知道我可能自己创建一个,但我宁愿不用我需要解析的少量HTML.

@H_502_4@我的问题是为什么Retrofit 2 RxJava适配器在Retrofit 2本身没有支持ResponseBody的情况下呢?有没有其他方法可以从Observable获取响应字符串?

@H_502_4@我的服务:

  1. public interface AuthenticationService() {
  2.  
  3. @GET("cas/login")
  4. Observable<Response<ResponseBody>> login();
  5. }
@H_502_4@相关的改造代码

  1. public static Retrofit getRetrofit() {
  2. if(mRetrofit == null) {
  3. return new Retrofit.Builder()
  4. .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
  5. .addConverterFactory(GsonConverterFactory.create(getGson()))
  6. .client(getOkHttpClient())
  7. .build();
  8. } return mRetrofit;
  9. }
  10.  
  11. public static AuthenticationService getAuthenticationService() {
  12. return getRetrofit().create(AuthenticationService.class);
  13. }
@H_502_4@回应尝试:

  1. private void login() {
  2. RestClient.getAuthenticationService().login()
  3. .observeOn(ASchedulers.newThread())
  4. .subscribeOn(AndroidSchedulers.mainThread())
  5. .doOnNext(this::onLoginResponse);
  6. }
  7.  
  8. private void onLoginResponse(Response<ResponseBody>> response) {
  9. try {
  10. parseResponse(response.body().string());
  11. } catch (IOException) {
  12. Timber.w(throwable,"Failed to login");
  13. }
  14. }
@H_502_4@新堆栈跟踪:

  1. 03-03 16:14:57.848 26866-26866/com.example.app E/AndroidRuntime: FATAL EXCEPTION: main
  2. Process: com.example.app,PID: 26866
  3. java.lang.IllegalArgumentException: Unable to create call adapter for rx.Observable<retrofit2.Response<okhttp3.ResponseBody>>
  4. for method AuthenticationService.getLoginForm
  5. at retrofit2.Utils.methodError(Utils.java:119)
  6. at retrofit2.MethodHandler.createCallAdapter(MethodHandler.java:52)
  7. at retrofit2.MethodHandler.create(MethodHandler.java:25)
  8. at retrofit2.Retrofit.loadMethodHandler(Retrofit.java:164)
  9. at retrofit2.Retrofit$1.invoke(Retrofit.java:145)
  10. at java.lang.reflect.Proxy.invoke(Proxy.java:393)
  11. at $Proxy3.getLoginForm(Unknown Source)
  12. at com.example.app.ui.fragment.LoginFragment.login(LoginFragment.java:206)
  13. at com.example.app.ui.fragment.LoginFragment.lambda$onContinue$1(LoginFragment.java:160)
  14. at com.example.app.ui.fragment.LoginFragment.access$lambda$1(LoginFragment.java)
  15. at com.example.app.ui.fragment.LoginFragment$$Lambda$4.onClick(Unknown Source)
  16. at android.view.View.performClick(View.java:5204)
  17. at android.view.View$PerformClick.run(View.java:21153)
  18. at android.os.Handler.handleCallback(Handler.java:739)
  19. at android.os.Handler.dispatchMessage(Handler.java:95)
  20. at android.os.Looper.loop(Looper.java:148)
  21. at android.app.ActivityThread.main(ActivityThread.java:5417)
  22. at java.lang.reflect.Method.invoke(Native Method)
  23. at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
  24. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
  25. Caused by: java.lang.IllegalArgumentException: Could not locate call adapter for rx.Observable<retrofit2.Response<okhttp3.ResponseBody>>.
  26. Tried:
  27. * retrofit2.ExecutorCallAdapterFactory
  28. at retrofit2.Retrofit.nextCallAdapter(Retrofit.java:230)
  29. at retrofit2.Retrofit.callAdapter(Retrofit.java:194)
  30. at retrofit2.MethodHandler.createCallAdapter(MethodHandler.java:50)
  31. ... 18 more

解决方法

尝试这样的事情:
  1. import okhttp3.ResponseBody;
  2. import retrofit2.Response;
  3.  
  4. @GET("/whatever")
  5. Observable<Response<ResponseBody>> getWhatever();
@H_502_4@编辑:不要忘记你必须为RxJava指定适配器:

  1. new Retrofit.Builder()
  2. ...
  3. .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
  4. .build()
  5. .create(Api.class);

猜你在找的Android相关文章