欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于OkHttp中response.body().string()的用法解析

 更新時(shí)間:2023年06月17日 14:28:05   作者:Songbl_  
這篇文章主要介紹了關(guān)于OkHttp中response.body().string()的用法解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

OkHttp中response.body().string()解析

在多次引用response.body().string()的時(shí)候,程序會(huì)崩潰掉。

下面通過(guò)源碼分析:

ResponseBody body = response.body();//獲取響應(yīng)體

Response中的string()方法如下:

? public final String string() throws IOException {
? //通過(guò)使用指定的 charset 解碼指定的 byte 數(shù)組,構(gòu)造一個(gè)新的 String
? ? return new String(bytes(), charset().name());
? }

對(duì)于bytes()方法

public final byte[] bytes() throws IOException {
? ? long contentLength = contentLength();
? ? if (contentLength > Integer.MAX_VALUE) {
? ? ? throw new IOException("Cannot buffer entire body for content length: " + contentLength);
? ? }
? ? BufferedSource source = source();
? ? byte[] bytes;
? ? try {
? ? ? bytes = source.readByteArray();
? ? } finally {
? ? ? Util.closeQuietly(source);
? ? }
? ? if (contentLength != -1 && contentLength != bytes.length) {
? ? ? throw new IOException("Content-Length and stream length disagree");
? ? }
? ? return bytes;
? }

可以看到,在finally中,執(zhí)行了資源的關(guān)閉操作。

在拿到資源之后,就將資源關(guān)閉了,所以只能獲取一次實(shí)體。

對(duì)于charset()方法

private Charset charset() {
?MediaType contentType = contentType();
?return contentType != null ? contentType.charset(UTF_8) : UTF_8;
? }
public static final Charset UTF_8 = Charset.forName("UTF-8");

根據(jù)響應(yīng)頭中的contentType 決定編碼形式。轉(zhuǎn)換為UTF-8.

OkHttp的坑:response.body().string() 只能調(diào)用一次

發(fā)現(xiàn)

在接微信登錄時(shí),通過(guò)構(gòu)造 OkHttpClient 對(duì)象發(fā)起一次請(qǐng)求并加入隊(duì)列,待服務(wù)端響應(yīng)后,回調(diào) Callback 接口觸發(fā) onResponse() 方法,然后在該方法中通過(guò) Response 對(duì)象處理返回結(jié)果、實(shí)現(xiàn)業(yè)務(wù)邏輯。

大致代碼如下

? private void getUserInfo() {
? ? ? ? String path = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openid;
? ? ? ? OkHttpClient client = new OkHttpClient();
? ? ? ? Request request = new Request.Builder()
? ? ? ? ? ? ? ? .url(path)
? ? ? ? ? ? ? ? .build();
? ? ? ? Call call = client.newCall(request);
? ? ? ? call.enqueue(new Callback() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onFailure(Call call, IOException e) {
? ? ? ? ? ? ? ? Log.d(TAG, "onFailure: userinfo" + e.getMessage());
? ? ? ? ? ? ? ? finish();
? ? ? ? ? ? }
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onResponse(Call call, Response response) throws IOException {
// ? ? ? ? ? ? ? ?Log.d(TAG, "onResponse: userinfo" + response.body().string()); ? ?//okhttp中 response.body().string()只允許調(diào)用一次
? ? ? ? ? ? ? ? final String result = response.body().string();
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? JSONObject jsonObject = new JSONObject(result);
? ? ? ? ? ? ? ? ? ? unionId = jsonObject.getString("unionid");
? ? ? ? ? ? ? ? ? ? headImgUrl = jsonObject.getString("headimgurl");
? ? ? ? ? ? ? ? ? ? nickname = jsonObject.getString("nickname");
? ? ? ? ? ? ? ? ? ? Log.d(TAG,"getUserInfo: unionId = "+unionId+" ?headImgUrl = "+ headImgUrl + " ?nickname = "+ nickname);
? ? ? ? ? ? ? ? } catch (JSONException e) {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? finish();
? ? ? ? ? ? }
? ? ? ? });
? ? }

在 onResponse() 中,為便于調(diào)試,我打印了返回體,然后通過(guò) parseResponseStr() 方法解析返回體(注意:這兒兩次調(diào)用了 response.body().string())。

這段看起來(lái)沒(méi)有任何問(wèn)題的代碼,實(shí)際運(yùn)行后卻出了問(wèn)題,,通過(guò)debug發(fā)現(xiàn)result在轉(zhuǎn)換成jsonObject時(shí)為null。

那為什么result會(huì)變?yōu)閚ull呢?通過(guò)網(wǎng)上資料查閱發(fā)現(xiàn),response.body().string()只能調(diào)用一次,調(diào)用完就會(huì)釋放掉資源,恍然大悟。。。

然后我點(diǎn)進(jìn)源碼看了一下:

public final String string() throws IOException {
? ? BufferedSource source = source();
? ? try {
? ? ? Charset charset = Util.bomAwareCharset(source, charset());
? ? ? return source.readString(charset);
? ? } finally {
? ? ? Util.closeQuietly(source);
? ? }
? }
Util.closeQuietly(source);

很棒,原來(lái)在我們調(diào)用了response.body的String()方法之后OkHttp 將響應(yīng)體的緩沖資源返回的同時(shí),調(diào)用 closeQuietly() 方法默默釋放了資源。

就是這個(gè)原因了。Get√

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android開(kāi)發(fā)Kotlin語(yǔ)言協(xié)程中的并發(fā)問(wèn)題和互斥鎖

    Android開(kāi)發(fā)Kotlin語(yǔ)言協(xié)程中的并發(fā)問(wèn)題和互斥鎖

    Android開(kāi)發(fā)Kotlin語(yǔ)言提供了多種機(jī)制來(lái)處理并發(fā)和同步,其中包括高層次和低層次的工具,對(duì)于常規(guī)的并發(fā)任務(wù),可以利用 Kotlin 協(xié)程提供的結(jié)構(gòu)化并發(fā)方式,而對(duì)于需要更低層次的鎖定機(jī)制,可以使用Mutex(互斥鎖)來(lái)實(shí)現(xiàn)對(duì)共享資源的線程安全訪問(wèn)
    2024-06-06
  • Android中使用ZXing生成二維碼(支持添加Logo圖案)

    Android中使用ZXing生成二維碼(支持添加Logo圖案)

    ZXing是谷歌的一個(gè)開(kāi)源庫(kù),可以用來(lái)生成二維碼、掃描二維碼。接下來(lái)通過(guò)本文給大家介紹Android中使用ZXing生成二維碼(支持添加Logo圖案),需要的朋友參考下
    2017-01-01
  • Android控件設(shè)置寬高比的方法

    Android控件設(shè)置寬高比的方法

    本篇文章主要介紹了Android控件設(shè)置寬高比的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • Android隱私協(xié)議提示彈窗的實(shí)現(xiàn)流程詳解

    Android隱私協(xié)議提示彈窗的實(shí)現(xiàn)流程詳解

    這篇文章主要介紹了Android隱私協(xié)議提示彈窗的實(shí)現(xiàn)流程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-01-01
  • Android實(shí)現(xiàn)動(dòng)態(tài)顯示或隱藏密碼輸入框的內(nèi)容

    Android實(shí)現(xiàn)動(dòng)態(tài)顯示或隱藏密碼輸入框的內(nèi)容

    這篇文章主要介紹了Android實(shí)現(xiàn)動(dòng)態(tài)顯示或隱藏密碼輸入框的內(nèi)容,主要通過(guò)設(shè)置EditText的setTransformationMethod()方法來(lái)實(shí)現(xiàn),需要的朋友可以參考下
    2014-09-09
  • Android編程獲取通知欄高度的方法

    Android編程獲取通知欄高度的方法

    這篇文章主要介紹了Android編程獲取通知欄高度的方法,涉及Android針對(duì)通知欄屬性相關(guān)操作技巧,需要的朋友可以參考下
    2016-01-01
  • Kotlin中Object關(guān)鍵字的使用示例介紹

    Kotlin中Object關(guān)鍵字的使用示例介紹

    在Kotlin中object是一個(gè)特殊的關(guān)鍵字。主要用于聲明一個(gè)類(lèi)的同時(shí)創(chuàng)建這個(gè)類(lèi)的對(duì)象(例如單例)。在Kotlin中它有三個(gè)方面的應(yīng)用:對(duì)象表達(dá)式,對(duì)象聲明和伴生對(duì)象
    2022-09-09
  • Android studio實(shí)現(xiàn)簡(jiǎn)易計(jì)算器App功能

    Android studio實(shí)現(xiàn)簡(jiǎn)易計(jì)算器App功能

    這篇文章主要為大家詳細(xì)介紹了Android studio實(shí)現(xiàn)簡(jiǎn)易計(jì)算器App功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Android 中API之Drawable資源詳解及簡(jiǎn)單實(shí)例

    Android 中API之Drawable資源詳解及簡(jiǎn)單實(shí)例

    這篇文章主要介紹了Android 中API之Drawable資源詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Java中的final關(guān)鍵字詳解及實(shí)例

    Java中的final關(guān)鍵字詳解及實(shí)例

    這篇文章主要介紹了Java中的final關(guān)鍵字詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-01-01

最新評(píng)論