Android OkHttp3簡介和使用詳解

一 OKHttp簡介

OKHttp是一個處理網絡請求的開源項目,Android 當前最火熱網絡框架,由移動支付Square公司貢獻,用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient)。?
OKHttpGitHub地址

OKHttp優點

  1. 支持HTTP2/SPDY(SPDY是Google開發的基于TCP的傳輸層協議,用以最小化網絡延遲,提升網絡速度,優化用戶的網絡使用體驗。)
  2. socket自動選擇最好路線,并支持自動重連,擁有自動維護的socket連接池,減少握手次數,減少了請求延遲,共享Socket,減少對服務器的請求次數。
  3. 基于Headers的緩存策略減少重復的網絡請求。
  4. 擁有Interceptors輕松處理請求與響應(自動處理GZip壓縮)。

OKHttp的功能

  1. PUT,DELETE,POST,GET等請求
  2. 文件的上傳下載
  3. 加載圖片(內部會圖片大小自動壓縮)
  4. 支持請求回調,直接返回對象、對象集合
  5. 支持session的保持

二 OkHttp3使用

主要介紹 OkHttp3 的 Get 請求、 Post 請求、 上傳下載文件 、 上傳下載圖片等功能 。

添加OkHttp3的依賴

compile 'com.squareup.okhttp3:okhttp:3.7.0'
compile 'com.squareup.okio:okio:1.12.0'

添加網絡權限

<uses-permission android:name="android.permission.INTERNET"/>

1.異步GET請求

        //1.創建OkHttpClient對象OkHttpClient okHttpClient = new OkHttpClient();//2.創建Request對象,設置一個url地址(百度地址),設置請求方式。Request request = new Request.Builder().url("http://www.baidu.com").method("GET",null).build();//3.創建一個call對象,參數就是Request請求對象Call call = okHttpClient.newCall(request);//4.請求加入調度,重寫回調方法call.enqueue(new Callback() {//請求失敗執行的方法@Overridepublic void onFailure(Call call, IOException e) {}//請求成功執行的方法@Overridepublic void onResponse(Call call, Response response) throws IOException {}});

上面就是發送一個異步GET請求的4個步驟:

  1. 創建OkHttpClient對象
  2. 通過Builder模式創建Request對象,參數必須有個url參數,可以通過Request.Builder設置更多的參數比如:header、method等
  3. 通過request的對象去構造得到一個Call對象,Call對象有execute()和cancel()等方法。
  4. 以異步的方式去執行請求,調用的是call.enqueue,將call加入調度隊列,任務執行完成會在Callback中得到結果。

注意事項:

  1. 異步調用的回調函數是在子線程,我們不能在子線程更新UI,需要借助于 runOnUiThread() 方法或者 Handler 來處理。
  2. onResponse回調有一個參數是response,如果我們想獲得返回的是字符串,可以通過response.body().string()獲取;如果希望獲得返回的二進制字節數組,則調用response.body().bytes();如果你想拿到返回的inputStream,則調response.body().byteStream(),有inputStream我們就可以通過IO的方式寫文件(后面會有例子)。

2.同步GET請求

        //1.創建OkHttpClient對象OkHttpClient okHttpClient = new OkHttpClient();//2.創建Request對象,設置一個url地址(百度地址),設置請求方式。Request request = new Request.Builder().url("http://www.baidu.com").method("GET",null).build();//3.創建一個call對象,參數就是Request請求對象Call call = okHttpClient.newCall(request);//4.同步調用會阻塞主線程,這邊在子線程進行new Thread(new Runnable() {@Overridepublic void run() {try {//同步調用,返回Response,會拋出IO異常Response response = call.execute();} catch (IOException e) {e.printStackTrace();}}}).start();

同步GET請求和異步GET請求基本一樣,不同地方是同步請求調用Call的execute()方法,而異步請求調用call.enqueue()方法(具體2個方法的不同點我下一遍具體源碼詳解再說)。

3.POST請求提交鍵值對

        //1.創建OkHttpClient對象OkHttpClient  okHttpClient = new OkHttpClient();//2.通過new FormBody()調用build方法,創建一個RequestBody,可以用add添加鍵值對 RequestBody  requestBody = new FormBody.Builder().add("name","zhangqilu").add("age","25").build();//3.創建Request對象,設置URL地址,將RequestBody作為post方法的參數傳入Request request = new Request.Builder().url("url").post(requestBody).build();//4.創建一個call對象,參數就是Request請求對象Call call = okHttpClient.newCall(request);//5.請求加入調度,重寫回調方法call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {}});

上面就是一個異步POST請求提交鍵值對的5個步驟:

  1. 創建OkHttpClient對象。
  2. 通過new FormBody()調用build方法,創建一個RequestBody,可以用add添加鍵值對 ,FormBody 是 RequestBody 的子類。
  3. 創建Request對象,設置URL地址,將RequestBody作為post方法的參數傳入。
  4. 創建一個call對象,參數就是Request請求對象。
  5. 請求加入調度,重寫回調方法。

通過對比我們發現異步的POST請求和GET請求步驟很相似。

4.異步POST請求提交字符串

POST請求提交字符串和POST請求提交鍵值對非常相似,不同地方主要是RequestBody,下面我們來具體看一下。?
在有些情況下客戶端需要向服務端傳送字符串,我們該怎么做??
我們需要用到另一種方式來構造一個 RequestBody 如下所示:

        MediaType mediaType = MediaType.parse("application/json; charset=utf-8");//"類型,字節碼"//字符串String value = "{username:admin;password:admin}"; //1.創建OkHttpClient對象OkHttpClient  okHttpClient = new OkHttpClient();//2.通過RequestBody.create 創建requestBody對象RequestBody requestBody =RequestBody.create(mediaType, value);//3.創建Request對象,設置URL地址,將RequestBody作為post方法的參數傳入Request request = new Request.Builder().url("url").post(requestBody).build();//4.創建一個call對象,參數就是Request請求對象Call call = okHttpClient.newCall(request);//5.請求加入調度,重寫回調方法call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {}});

5.異步POST請求上傳文件

我們這里舉一個上傳圖片的例子,也可以是其他文件如,TXT文檔等,不同地方主要是RequestBody,首先我們要添加存儲卡讀寫權限,在 AndroidManifest.xml 文件中添加如下代碼:

 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

下面我們具體看一下上傳文件代碼。

        //1.創建OkHttpClient對象OkHttpClient  okHttpClient = new OkHttpClient();//上傳的圖片File file = new File(Environment.getExternalStorageDirectory(), "zhuangqilu.png");//2.通過RequestBody.create 創建requestBody對象,application/octet-stream 表示文件是任意二進制數據流RequestBody requestBody =RequestBody.create(MediaType.parse("application/octet-stream"), file);//3.創建Request對象,設置URL地址,將RequestBody作為post方法的參數傳入Request request = new Request.Builder().url("url").post(requestBody).build();//4.創建一個call對象,參數就是Request請求對象Call call = okHttpClient.newCall(request);//5.請求加入調度,重寫回調方法call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {}});

6.異步GET請求下載文件

下載文件也是我們經常用到的功能,我們就舉個下載圖片的例子吧

        //1.創建OkHttpClient對象OkHttpClient okHttpClient = new OkHttpClient();//2.創建Request對象,設置一個url地址(百度地址),設置請求方式。Request request = new Request.Builder().url("https://www.baidu.com/img/bd_logo1.png").get().build();//3.創建一個call對象,參數就是Request請求對象Call call = okHttpClient.newCall(request);//4.請求加入調度,重寫回調方法call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {Log.e(TAG, "onFailure: "+call.toString() );}@Overridepublic void onResponse(Call call, Response response) throws IOException {//拿到字節流InputStream is = response.body().byteStream();int len = 0;//設置下載圖片存儲路徑和名稱File file = new File(Environment.getExternalStorageDirectory(),"baidu.png");FileOutputStream fos = new FileOutputStream(file);byte[] buf = new byte[128];while((len = is.read(buf))!= -1){fos.write(buf,0,len);Log.e(TAG, "onResponse: "+len );}fos.flush();fos.close();is.close();}});

Get請求下載文件還是比較簡單,設置下載地址,在回調函數中拿到了圖片的字節流,然后保存為了本地的一張圖片。

從網絡下載一張圖片并直接設置到ImageView中。

@Override
public void onResponse(Call call, Response response) throws IOException {InputStream is = response.body().byteStream();//使用 BitmapFactory 的 decodeStream 將圖片的輸入流直接轉換為 Bitmap final Bitmap bitmap = BitmapFactory.decodeStream(is);//在主線程中操作UIrunOnUiThread(new Runnable() {@Overridepublic void run() {//然后將Bitmap設置到 ImageView 中imageView.setImageBitmap(bitmap);}});is.close();
}

主要注釋已在代碼中了。

7.異步POST請求上傳Multipart文件

我們在有些情況下既要上傳文件還要上傳其他類型字段。比如在個人中心我們可以修改名字,年齡,修改圖像,這其實就是一個表單。這里我們用到MuiltipartBody ,它 是RequestBody 的一個子類,我們提交表單就是利用這個類來構建一個 RequestBody,我們來看一下具體代碼。

        //1.創建OkHttpClient對象OkHttpClient  okHttpClient = new OkHttpClient();//上傳的圖片File file = new File(Environment.getExternalStorageDirectory(), "zhuangqilu.png");//2.通過new MultipartBody build() 創建requestBody對象,RequestBody  requestBody = new MultipartBody.Builder()//設置類型是表單.setType(MultipartBody.FORM)//添加數據.addFormDataPart("username","zhangqilu").addFormDataPart("age","25").addFormDataPart("image","zhangqilu.png",
RequestBody.create(MediaType.parse("image/png"),file)).build();//3.創建Request對象,設置URL地址,將RequestBody作為post方法的參數傳入Request request = new Request.Builder().url("url").post(requestBody).build();//4.創建一個call對象,參數就是Request請求對象Call call = okHttpClient.newCall(request);//5.請求加入調度,重寫回調方法call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {}});

注意事項

  1. 如果提交的是表單,一定要設置表單類型,?setType(MultipartBody.FORM)
  2. 提交文件 addFormDataPart() 方法的第一個參數就是類似于鍵值對的鍵,是供服務端使用的,第二個參數是文件的本地的名字,第三個參數是 RequestBody,里面包含了我們要上傳的文件的路徑以及 MidiaType。

三 結束

Android OkHttp3簡介和使用詳解就到這里了,下一篇我們分析 OkHttp3源碼。

版權聲明:

本文為原作者原創文章,此處轉載僅學習研究。

原文地址:https://blog.csdn.net/zhangqiluGrubby/article/details/71480546

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286446.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286446.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286446.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言試題一之計算并輸出n(包括n)以內能被5或9整除的所有自然數的倒數之和

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 請編寫函數…

MonoRail學習筆記十一:頁面控件的填充和驗證

Mono提供很多組件可以方便的處理頁面&#xff1a;可以自動將后臺的值填充到頁面&#xff0c;可以自動進行Javascript驗證&#xff0c;可以自動在后臺驗證等。這些功能都是比較實用的&#xff0c;可以減少很多開發 FormHelper是用來對應html頁面中Form內的tag的&#xff0c;可以…

JavaBean的詳細及引用

1.JavaBean實際是具有統一接口格式的java類 2.JavaBean的組成&#xff1a;屬性(Properties)、方法(Method)、事件(Events) 3.一個JavaBean的例子(該例子是用的Simple屬性<屬性在以后說>) //我遵循的習慣是類名大寫&#xff0c;包名小寫package com;//意思是將 FirstBean這…

驅動開發實戰之TcpClient

場景模擬假設你有一批非標設備需要對接&#xff0c;你需要根據設備方提供的協議&#xff0c;為IoTGateway開發驅動&#xff0c;進行數據交互。文章比較長也可以到官網會有更好的體驗&#xff0c;地址:http://iotgateway.net/docs/iotgateway/driver/tcpclient請先瀏覽上一篇驅動…

php讀取acc

<?PHP/*創建ADO連接*/$conn new COM("ADODB.Connection") or die ("ADO Connection faild.");$connstr "DRIVER{Microsoft Access Driver (*.mdb)}; DBQ" . realpath("DATUM/cnbt.mdb");$conn->Open($connstr);/*創建記錄集查…

【遙感數字圖像處理實驗】Erdas版詳細圖文實驗教程(8實驗全)

文章目錄1. 專欄簡介2. 專欄地址3. 專欄目錄1. 專欄簡介 遙感數字圖像的處理&#xff0c;是對遙感數字圖像的計算機處理。與工業和醫學數字圖像不同&#xff0c;遙感數字圖像類型更為多樣&#xff0c;內容更為復雜。因此&#xff0c;遙感數字圖像的處理&#xff0c;不僅需要掌握…

WEBAPI 增加身份驗證 (OAUTH 2.0方式)

1&#xff0c;在Webapi項目下添加如下引用&#xff1a;Microsoft.AspNet.WebApi.OwinOwinMicrosoft.Owin.Host.SystemWebMicrosoft.Owin.Security.OAuthMicrosoft.Owin.Security.CookiesMicrosoft.AspNet.Identity.OwinMicrosoft.Owin.Cors2&#xff0c; 在項目下新建Startup類…

C語言試題二之計算并輸出下列多項式值s=1+1/(1+2)+1/(1+2+3)+..1/(1+2+3…+50)

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 計算并輸出…

無代碼iVX編程實現簡單 小蜜蜂 經典游戲

首先咱們打開 iVX 的在線編輯器&#xff1a;https://editor.ivx.cn/ 隨后選擇相對定位&#xff0c;咱們選擇2D游戲類型制作一個簡單小蜜蜂游戲&#xff1a; 接著咱們創建一個物理世界&#xff0c;并且將頁面布局如以下&#xff1a; 以上布局中&#xff0c;矩形為模擬飛機、…

【無人機航空攝影測量精品教程】目錄:Pix4d、EPS、CC、PhotoScan、Godwork項目化作業流程及注意事項匯總

文章目錄1. 專欄簡介2. 專欄地址3. 專欄目錄1. 專欄簡介 該專欄為目前最為熱門的無人機航測內外業項目&#xff0c;主要內容包括&#xff1a;無人機航測外業作業流程&#xff08;像控點布設、航線規劃、仿地飛行、航拍&#xff09;和內業數據處理軟件&#xff08;Pix4d、CC、EP…

WPF 基礎控件之 Slider 樣式

其他基礎控件1.Window2.Button3.CheckBox4.ComboBox5.DataGrid 6.DatePicker7.Expander8.GroupBox9.ListBox10.ListView11.Menu12.PasswordBox13.TextBox14.RadioButton15.ToggleButtonSlider 實現下面的效果1&#xff09;Slider來實現動畫&#xff1b;Grid嵌套 Border并設置S…

SQL 通過syscolumns.xtype動態查找指定數據類型字段所包含的數據

表中太多列&#xff0c;只想查找某些比如&#xff0c;數據類型為varchar的字段的數據。 思路&#xff1a;1、先獲取列名&#xff1a; select * from syscolumns where id(select max(id) from sysobjects where xtypeu and nametest_A)2、查找指定數據類型&#xff0c;xtype就…

css案例學習之span邊框實現的特殊效果

bottom left bottom right top left top right 配合顏色來使用&#xff0c;實現一些神奇的效果 #menu a span{height:0;width:0;/*border-top:solid 6px #fff;border-left:solid 6px #f90;*//*border-top:solid 6px #fff;border-right:solid 6px #f90;*//*border-bottom:solid …

網頁版消消樂快速實現,無代碼嗎iVX 真那么簡單?

最近沒事想做個消消樂&#xff0c;然后聽說 iVX 免費了&#xff0c;所以又跑去看看 iVX 了&#xff0c;就用一個無代碼來看看消消樂怎么玩吧。 首先咱們打開 iVX 的在線編輯器&#xff1a;https://editor.ivx.cn/ 隨后咱們不需要游戲類型也可以制作一個消消樂游戲&#xff1a…

虛擬化記錄--No.1

近段時間&#xff0c;會花些時間做關于系統虛擬化的工作。所以會做一些這樣的記錄。相信很多東西不會特別成體系&#xff0c;每個人因為關注的不同而記錄和學習的重點也會有比較大的出入。這篇是NO.1(注意不是TOP 1 )真的是由于對于ORACLE很有感覺&#xff0c;所以上手去做的也…

C語言試題三之計算并輸出 s=1+(1+2^(0.5))+(1+2^(0.5)+3^(0.5))+…+(1+2^(0.5)+3^(0.5)+…+n^(0.5))

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1 、題目 請編寫函…

C# Java間進行RSA加密解密交互

這里&#xff0c;講一下RSA算法加解密在C#和Java之間交互的問題&#xff0c;這兩天糾結了很久&#xff0c;也看了很多其他人寫的文章&#xff0c;頗受裨益&#xff0c;但沒能解決我的實際問題&#xff0c;終于&#xff0c;還是被我搗鼓出來了。 首先&#xff0c;介紹一下寫這代…

【Microstation】三維建模基礎及軟件入門到精通實驗教程目錄

文章目錄1. 專欄簡介2. 專欄地址3. 專欄目錄1. 專欄簡介 MicroStation是一款非常不錯的二維和三維設計軟件&#xff0c;由奔特力&#xff08;Bentley&#xff09;工程軟件系統有限公司開發的一款軟件。在CAD設計上該軟件是和AutoCAD是齊名的軟件&#xff0c;其專用的文件格式是…

無代碼iVX編程實現簡單魂斗羅

首先咱們打開 iVX 的在線編輯器&#xff1a;https://editor.ivx.cn/ 隨后咱們選擇2D游戲類型制作一個簡單魂斗羅游戲&#xff1a; 隨后咱們開始創建一個物理世界&#xff0c;不并且在物理世界之下創建一個一個圖片添加物體屬性&#xff0c;在物體屬性中更改對應的屬性內容&am…

【ArcGIS遇上Python】ArcGIS Python批處理入門到精通實用教程目錄

文章目錄1. 專欄簡介2. 專欄地址3. 專欄目錄1. 專欄簡介 Python語言是目前很火熱的語言&#xff0c;極大的促進了人工智能發展。你知道在ArcGIS中也會有python的身影嗎&#xff1f;事實上&#xff0c;在ArcGIS中使用Python會起到事半功倍的效果&#xff0c;大大提高工作效率&am…