Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用RxAndroid和改装2检索响应主体?_Android_Rx Java_Rx Android_Retrofit2_Okhttp3 - Fatal编程技术网

如何使用RxAndroid和改装2检索响应主体?

如何使用RxAndroid和改装2检索响应主体?,android,rx-java,rx-android,retrofit2,okhttp3,Android,Rx Java,Rx Android,Retrofit2,Okhttp3,我正在使用改型2(beta 4),我希望从使用标准的调用响应转变为RxAndroid可观察的响应。我成功地将大部分通话从Call切换到Observable。我的一些通话使用了Call,效果很好,但当我调出Call时,我遇到了一个错误: 03-03 15:21:44.237 27333-27333/com.example.app E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.app, PID: 27333

我正在使用改型2(beta 4),我希望从使用标准的
调用
响应转变为RxAndroid
可观察的
响应。我成功地将大部分通话从
Call
切换到
Observable
。我的一些通话使用了
Call
,效果很好,但当我调出
Call
时,我遇到了一个错误:

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
相关改装代码:

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");
    }
}
private void login(){
RestClient.getAuthenticationService().login()
.observeOn(asSchedulers.newThread())
.subscribeOn(AndroidSchedulers.mainThread())
.doOnNext(此::onLoginResponse);
}
专用void onLoginResponse(响应>响应){
试一试{
parseResponse(response.body().string());
}捕获(IOException){
Timber.w(可丢弃,“登录失败”);
}
}
新堆栈跟踪:

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
03-03 16:14:57.848 26866-26866/com.example.app E/AndroidRuntime:FATAL EXCEPTION:main
进程:com.example.app,PID:26866
java.lang.IllegalArgumentException:无法为rx.Observable创建调用适配器
对于方法AuthenticationService.getLoginForm
at2.Utils.methodError(Utils.java:119)
在2.MethodHandler.createCallAdapter(MethodHandler.java:52)处
创建(MethodHandler.java:25)
在Refundation2.Refundation.loadMethodHandler(Refundation.java:164)中
在reformation2.reformation$1.invoke(reformation.java:145)
位于java.lang.reflect.Proxy.invoke(Proxy.java:393)
位于$Proxy3.getLoginForm(未知源)
位于com.example.app.ui.fragment.LoginFragment.login(LoginFragment.java:206)
位于com.example.app.ui.fragment.LoginFragment.lambda$onContinue$1(LoginFragment.java:160)
位于com.example.app.ui.fragment.LoginFragment.access$lambda$1(LoginFragment.java)
位于com.example.app.ui.fragment.LoginFragment$$Lambda$4.onClick(未知源)
在android.view.view.performClick上(view.java:5204)
在android.view.view$PerformClick.run(view.java:21153)
位于android.os.Handler.handleCallback(Handler.java:739)
位于android.os.Handler.dispatchMessage(Handler.java:95)
位于android.os.Looper.loop(Looper.java:148)
位于android.app.ActivityThread.main(ActivityThread.java:5417)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:726)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
原因:java.lang.IllegalArgumentException:找不到rx.Observable的调用适配器。
尝试:
*改装2.2.1适配器工厂
在Reformation2.Reformation.NextCalAdapter(Reformation.java:230)中
在reformation2.reformation.callAdapter(reformation.java:194)
在2.MethodHandler.createCallAdapter(MethodHandler.java:50)处
... 还有18个

尝试以下方法:

import okhttp3.ResponseBody;
import retrofit2.Response;

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

尝试了,同样的结果:/I我还尝试了一个普通的
okhttp3.Respone
,它也不起作用。是的,我已经正确设置了
RxJavaCallAdapterFactory
,因为我的另一个
可观察的
响应按预期工作。它不能与okhttp3.Respone一起工作,你需要改型的响应。我一直在使用
改型2.Response
,以及
okhttp3.ResponseBody
(okhttp3没有
响应
,只有
响应
)。你以前用过这个吗?我的答案应该可以。发布您正在使用的全部代码,以及您从我的代码中获得的堆栈跟踪。请发布实际代码。@TudorLuca更新为code@TudorLuca很抱歉浪费了你的时间。我发现我实际上是在使用一个没有RxJavaCallAdapterFactory的改装对象(我应该删除它)。我正在分解当前的代码,它有点乱。不管怎样,谢谢你的帮助。@Bryan你能澄清最后一句话吗?@tir38这是一个愚蠢的错误,当时我正试图修复一些旧代码。我在代码中意外地设置了两个
reformation
对象,一个带有
RxJavaCallAdapterFactory
设置,另一个没有设置。我在没有适配器工厂的情况下查询旧的
改装
对象,这就是为什么我无法获得可观察的
对象。
import okhttp3.ResponseBody;
import retrofit2.Response;

@GET("/whatever")
Observable<Response<ResponseBody>> getWhatever();
    new Retrofit.Builder()
            ...
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .build()
            .create(Api.class);