Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.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
Android 由于okhttp异步HTTP POST请求中的onResponse代码导致java.lang.IllegalStateException_Android_Retrofit2_Okhttp_Leanback - Fatal编程技术网

Android 由于okhttp异步HTTP POST请求中的onResponse代码导致java.lang.IllegalStateException

Android 由于okhttp异步HTTP POST请求中的onResponse代码导致java.lang.IllegalStateException,android,retrofit2,okhttp,leanback,Android,Retrofit2,Okhttp,Leanback,我在这里写了一段代码: public class Wizard1 extends GuidedStepFragment implements Callback { private boolean sendPhoneNumber(String userPhoneNumber) { OkHttpClient client = new OkHttpClient(); RequestBody requestBody = new MultipartBody.B

我在这里写了一段代码:

public class Wizard1 extends GuidedStepFragment implements Callback {

    private boolean sendPhoneNumber(String userPhoneNumber) {

        OkHttpClient client = new OkHttpClient();

        RequestBody requestBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("request_magic_code", Urls.REQUEST_MAGIC_CODE)
                .build();

        Request request = new Request.Builder()
                .url(Urls.HOST + Urls.SEND_PHONE_NUMBER)
                .post(requestBody)
                .build();

        client.newCall(request).enqueue(this);
        return success;
    }

    @Override
    public void onFailure(@NonNull Call call, @NonNull IOException e) {
        e.printStackTrace();
    }

    @Override
    public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
        ResponseBody myResponse = response.body();
        Log.d("SS", response.body().string());

    Log.d("SS", response.body().string());

        if (myResponse != null) {
            success = true;
            }

}
当我运行这个程序时,令人惊讶的是,我得到了java.lang.IllegalStateException。更令人惊讶的是,如果删除第二行Log.d,则不会发生异常

发生了什么事?为什么在onResponse中添加虚拟行会导致此错误

以下是错误的完整日志:

10-24 05:16:38.307 6639-6659/com.example.android.persistence W/System.err:java.lang.IllegalStateException:closed 在okio.RealBufferedSource.rangeEquals(RealBufferedSource.java:398) 在okio.RealBufferedSource.rangeEquals(RealBufferedSource.java:392) 在okhttp3.internal.Util.bomAwareCharset(Util.java:431) 在okhttp3.ResponseBody.string(ResponseBody.java:174)10-24 05:16:38.308 6639-6659/com.example.android.persistence W/System.err:
在 android.support.v17.leanback.supportleanbackshowcase.app.wizard.WizardGetPhoneNumber.onResponse(WizardGetPhoneNumber.java:244) 在okhttp3.RealCall$AsyncCall.execute(RealCall.java:141) 运行(NamedRunnable.java:32) 位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 运行(Thread.java:761)


来自
改装的车身
响应仅可访问一次,读取后将被清除,在您的情况下,将第二次记录到控制台

从文件:

从源服务器到客户端应用程序的一次触发流,包含响应正文的原始字节

更多详细信息


您应该继续使用保存的变量,即
myResponse
变量。

您正在使用
response.body().string()
两次

从OkHttp 3: 响应主体只能使用一次。

您可以创建局部变量并使用它

@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
    ResponseBody body = response.body();
    if(body != null) {
        try {
            //Use it anytime you want
            String responseString = body.string();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
或者你可以复制ResponseBook

@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
    ResponseBody body = response.body();
    //Warning: this method loads the requested bytes into memory. Most
    // applications should set a modest limit on {@code byteCount}, such as 1 MiB.
    int bufferSize = 1024 * 1024;
    ResponseBody copy = response.peekBody(bufferSize);
}
但要注意正确使用
缓冲区大小
,以防止

另外,您不需要将字符串记录到Logcat。调试OkHttp客户端的有效方法很少,例如

  • -Android studio配置OkHttp请求的插件
  • -http代理应用程序(安装程序)
  • -Android应用程序的调试桥

是的,谢谢,我之所以收到这个消息是因为两个API调用具有相同的响应处理回调