當前位置:首頁 » 安卓系統 » android非同步http

android非同步http

發布時間: 2023-05-15 04:34:16

A. android中okhttp怎麼處理異常

下面是獲取到json字元串。 enqueue就是非同步請求的意思。

OkHttpClient mHttpClient = new OkHttpClient();

Request request = new Request.Builder().url(url)
.build();
mHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
//載入失敗
}

@Override
public void onResponse(Response response) throws IOException {
//成功獲取數據
if (response.isSuccessful()){
String json = response.body().toString();
Log.d("mainai", "onResponse() returned: " + json);

}
}
});

B. android httpurlconnection 是非同步請求么

HttpURLConnection conn = (HttpURLConnection) url.openConnection();
在得到一個連接對象時,應該就已經向伺服器發送請求了
可參考:http://www.cnblogs.com/devinzhang/archive/2012/01/08/2316453.html

C. Android網路請求庫【OkHttp4.9.3】基本用法與原理分析

OkHttp是一套處理 HTTP 網路請求的依賴庫,由 Square 公司設計研發並開源,目前可以在 java 和 Kotlin 中使用。對於 Android App 來說,OkHttp 現在幾乎已經占據了所有的網路請求操作,Retrofit + OkHttp實現網路請求似乎成了一種標配。因此它也是每一個 Android 開發工程師的必備技能,了解其內部實現原理可以更好地進行功能擴展、封裝以及優化。

OkHttp的高效性體現在:

第一步:創建OkHttpClient,創建OkHttpClient有兩種方式:

OkHttpClient提供了豐富的配置方法,例如添加攔截器、指定連接池、設置請求超時等等。

第二步:創建請求

使用Request.Builder() 構建Request實例

第三步:發起網路請求

OkHttp支持同步和非同步兩種請求方式

OkHttp的使用方法非常簡單,三步操作就可以發起一個簡單的同步或非同步請求。我們也可以很輕松地對網路請求進行配置,例如添加請求頭、設置請求方式、設置請求超時等等,這些配置參數會在源碼分析過程中詳細介紹。

現在我們已經學會了三步操作發起網路請求,接下來以這三個步驟為切入點,深入到源碼中學習OkHttp的實現原理,廢話少說馬上開車。

OkHttpClient創建方式有兩種,我們看看兩種方式有什麼區別。

第一種直接使用默認構造函數,內部依然是使用建造者模式

第二種使用建造者模式

兩種方式最終都是調用構造函數OkHttpClient(builder:Builder),由參數builder負責所有的參數配置工作。

當您創建單個OkHttpClient實例並將其用於所有 HTTP 調用時,OkHttp 性能最佳。 這是因為每個OkHttpClient都擁有自己的連接池和線程池,重用連接和線程可減少延遲並節省內存。 相反,為每個請求創建一個客戶端會浪費空閑池上的資源。

Request同樣使用建造者模式來創建,這里貼上部分重要源碼,很簡單就不細說了。

OkHttp發起網路請求分為同步請求和非同步請求兩種方式,我們只分析非同步請求流程,因為只要理解了非同步請求過程,基本上也就明白同步請求是怎麼一回事了。

RealCall是連接應用層與網路層的橋梁,負責處理連接、請求、響應和數據流。

Dispatcher維護著一套非同步任務執行策略,分析策略之前先介紹幾個重要概念:

client.dispatcher.enqueue(AsyncCall(responseCallback)) 執行步驟為:

AsyncCall實現了Runnable介面,因此一旦被線程池中的線程處理就會調用它的run()方法:

話休絮煩,我們開始分析攔截器責任鏈:

責任鏈執行流程:首先獲取當前攔截器interceptor,並且調用interceptor.intercept(next)執行攔截器操作。這里的next表示的是index+1後的責任鏈對象,攔截器的intercept()方法內部會調用next.proceed(request)方法再次進入到責任鏈,由於此時index已經加1,所以處理的是下一個攔截器。

如此循環往復,直到處理完責任鏈上最後一個攔截器為止。

注意除最後一個攔截器CallServerInterceptor不會調用chain.proceed(request)方法之外,其他攔截器都應該至少調用一次chain.proceed(request)方法。

為了驗證上面的結論,我們進入到RetryAndFollowUpInterceptor的intercept()方法一探究竟:

可以看到注釋1處重新進入責任鏈處理下一個攔截器。

有興趣可以自行查看最後一個攔截器CallServerInterceptor源碼,此處只給出本人閱讀源碼後得出的結論:

以上就是攔截器責任鏈的工作流程,我們再通過流程圖仔細感受一下。

分析完攔截器責任鏈,我們繼續分析AsyncCall#run()方法:

我們看到,如果()方法成功獲得服務端返回的數據,則調用responseCallback.onResponse(this@RealCall, response)方法完成非同步回調;如果服務端數據獲取失敗(請求異常),則調用responseCallback.onFailure(this@RealCall, canceledException)方法完成非同步回調

需要注意的是,responseCallback回調是在子線程中完成的,所以如果想把數據顯示到UI上,需要切換回主線程進行UI操作。

OkHttp發起網路請求全過程:

【知識點】OkHttp 原理 8 連問

D. android-async-http 怎麼支持patch方法

先來看一下最基本的用法

AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.google.com", new AsyncHttpResponseHandler() {
@Override
public void onSuccess(String response) {
System.out.println(response);
}
});

通過AsyncHttpClient類的實例就可以執行網路請求,包括get、put、post、head、delete。並指定一個ResponseHandlerInterface的實例接收請求結果。(onSuccess參數不對,此處只說明基本用法,詳細參數看源碼)

主要類介紹

AsyncHttpRequest

繼承自Runnabler,被submit至線程池執行網路請求並發送start,success等消息

AsyncHttpResponseHandler

接收請求結果,一般重寫onSuccess及onFailure接收請求成功或失敗的消息,還有onStart,onFinish等消息

TextHttpResponseHandler

繼承自AsyncHttpResponseHandler,只是重寫了AsyncHttpResponseHandler的onSuccess和onFailure方法,將請求結果由byte數組轉換為String

JsonHttpResponseHandler

繼承自TextHttpResponseHandler,同樣是重寫onSuccess和onFailure方法,將請求結果由String轉換為JSONObject或JSONArray

BaseJsonHttpResponseHandler

繼承自TextHttpResponseHandler,是一個泛型類,提供了parseResponse方法,子類需要提供實現,將請求結果解析成需要的類型,子類可以靈活地使用解析方法,可以直接原始解析,使用gson等。

RequestParams

請求參數,可以添加普通的字元串參數,並可添加File,InputStream上傳文件

AsyncHttpClient

核心類,使用HttpClient執行網路請求,提供了get,put,post,delete,head等請求方法,使用起來很簡單,只需以url及RequestParams調用相應的方法即可,還可以選擇性地傳入Context,用於取消Content相關的請求,同時必須提供ResponseHandlerInterface(AsyncHttpResponseHandler繼承自ResponseHandlerInterface)的實現類,一般為AsyncHttpResponseHandler的子類,AsyncHttpClient內部有一個線程池,當使用AsyncHttpClient執行網路請求時,最終都會調用sendRequest方法,在這個方法內部將請求參數封裝成AsyncHttpRequest(繼承自Runnable)交由內部的線程池執行。

SyncHttpClient

繼承自AsyncHttpClient,同步執行網路請求,AsyncHttpClient把請求封裝成AsyncHttpRequest後提交至線程池,SyncHttpClient把請求封裝成AsyncHttpRequest後直接調用它的run方法。

E. Android用httpURLconnection如何多次網路請求,第一次請求的JSON數據解析出

用非同步請求,然後請求的到的參數再次非同步第二個網路請求,完了就顯示在TextView上

F. android9.0以上http請求失敗的解決方法

在android9.0以上由於安全性高了,所有不做處理http不能使用,有3中解決方法
1.最簡單的方法降級targetSdkVersion的版本
將 targetSdkVersion 將到27或27以下

2.伺服器請求http改為https (推薦)
推薦使用這個方法,畢竟https的安全行高

3.兼容http請求
(1):在清單文件中設置networkSecurityConfig屬性

(2)在res/xml文件夾下創建network_security_config.xml

G. Android中可以同時請求多個HTTP請求嗎我

1)封裝HttpClient

2)由於用到線程池,可以進行多任務網路請求操作

3)沒有網路的時候進行網路狀態檢查

4)對請求的數據根據URL進行緩存到本地sqlite資料庫中(我剛剛想起了 post請求的時候需要對緩存url及本地數據存取做修改才可以正常用 如果不想進行修改可以用get形式)

5)本demo可以直接運行 本來想測試protobuf進行數據處理的 要放在github上就改成json了(entity中有簡單的xml解析:Menu.java 其他的都是json的 json 也可用Gson更方便)

先介紹下流程圖

H. android OKhttp 非同步POST請求

可以採用okGo 開實現,
OkGo.<String>post(BASEURL + "/test/deviceInfo")
.upJson(jsonObject)
.execute(callback);
然後在
@Override
public void onSuccess(Response<String> response) {} 內進行處理

I. Android 我的一個APP有時會出現HTTP請求失敗的情況,其他應用正常聯網,重啟後恢復正常

是不是沒有在非同步線程中請求數據

J. android http連接意外中斷的異常怎麼處理

我估計是你沒有使用非同步機制打開網路,在UI線程中直接打開HTTP連接訪問網路是不對的,你要使用線程,如下:
/銀褲衫/ 在需要http連接網路的地方鋒腔調純純用
new Thread(new Runnable(
public void run()

{
// 這里http連接伺服器

//若需要更新界面,可以結合Handler來處理,如下

updateHandler.sentMessage(XXXX);//具體要傳什麼參數需要自己定義

}

)).start();

熱點內容
關閉androidstudio 發布:2025-02-14 03:53:42 瀏覽:18
安卓腳本一鍵打板 發布:2025-02-14 03:50:16 瀏覽:866
我的世界租賃伺服器會被封ip嗎 發布:2025-02-14 03:46:05 瀏覽:982
資料庫附 發布:2025-02-14 03:44:43 瀏覽:837
安卓系統解不了鎖怎麼辦 發布:2025-02-14 03:44:35 瀏覽:552
怎麼查詢信用卡密碼 發布:2025-02-14 03:42:04 瀏覽:318
studio外貿服裝直播腳本 發布:2025-02-14 03:34:16 瀏覽:453
python集合運算符 發布:2025-02-14 03:06:18 瀏覽:205
pic編譯軟體 發布:2025-02-14 03:01:04 瀏覽:984
反編譯在編譯 發布:2025-02-14 02:55:36 瀏覽:418