亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

OKHttp 響應失敗:java.lang.IllegalStateException:已關閉

OKHttp 響應失?。簀ava.lang.IllegalStateException:已關閉

暮色呼如 2023-08-23 15:03:31
我請求鏈接以獲取 JSON,但 response.body().string() 值始終有錯誤。另一種方法是,我將response.body().string()拆分為response.body()和字符串,但Android studio找不到ResponseBody。2路不行。請幫忙!String doGetRequest(String url) throws IOException {       Request request = new Request.Builder()            .url(url)            .build();    try (Response response = client.newCall(request).execute()) {        System.out.println(response.body().string());        //ResponseBody responseBody = response.body();        //String content = responseBody.string();        //System.out.println(content);        return response.body().string();    }}
查看完整描述

3 回答

?
明月笑刀無情

TA貢獻1828條經驗 獲得超4個贊

response.body().string() → 您只能調用 string() 一次。


由于響應正文可能很大,因此 OkHttp 不會將其存儲在內存中,而是在您需要時將其作為流從網絡讀取。


當您將正文作為 string() 讀取時,OkHttp 將下載響應正文并將其返回給您,而不保留對字符串的引用,如果沒有新請求,則無法下載兩次。


您不止一次地調用它。


try(..){

    System.out.println(response.body().string());// once

    return response.body().string();`// twice

 }

您可以通過調用一次將響應保存在變量中,然后使用該變量進行進一步使用。


try(..){

  String responseData = response.body().string();//Be cautious about memory constraint here.

  System.out.println(responseData);

  return responseData;`

}


查看完整回答
反對 回復 2023-08-23
?
當年話下

TA貢獻1890條經驗 獲得超9個贊

發生這種情況是因為.string()只能調用一次

您可以通過以下方式解決該問題(Java):

ResponseBody responseBodyCopy = response.peekBody(Long.MAX_VALUE);
responseBodyCopy.string();

通過復制響應正文,您可以避免使用.string()兩次


查看完整回答
反對 回復 2023-08-23
?
胡子哥哥

TA貢獻1825條經驗 獲得超6個贊

也許你正在像這樣的攔截器中關閉你的響應


override fun intercept(chain: Interceptor.Chain): Response {

//...

val response = chain.proceed(builder.build())

response.close()

//...

}


查看完整回答
反對 回復 2023-08-23
  • 3 回答
  • 0 關注
  • 411 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號