Android OkHttp3简介和使用详解
一 OKHttp簡(jiǎn)介
OKHttp是一個(gè)處理網(wǎng)絡(luò)請(qǐng)求的開(kāi)源項(xiàng)目,Android 當(dāng)前最火熱網(wǎng)絡(luò)框架,由移動(dòng)支付Square公司貢獻(xiàn),用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient)。?
OKHttpGitHub地址
OKHttp優(yōu)點(diǎn)
OKHttp的功能
二 OkHttp3使用
主要介紹 OkHttp3 的 Get 請(qǐng)求、 Post 請(qǐng)求、 上傳下載文件 、 上傳下載圖片等功能 。
添加OkHttp3的依賴(lài)
compile 'com.squareup.okhttp3:okhttp:3.7.0' compile 'com.squareup.okio:okio:1.12.0'添加網(wǎng)絡(luò)權(quán)限
<uses-permission android:name="android.permission.INTERNET"/>1.異步GET請(qǐng)求
//1.創(chuàng)建OkHttpClient對(duì)象OkHttpClient okHttpClient = new OkHttpClient();//2.創(chuàng)建Request對(duì)象,設(shè)置一個(gè)url地址(百度地址),設(shè)置請(qǐng)求方式。Request request = new Request.Builder().url("http://www.baidu.com").method("GET",null).build();//3.創(chuàng)建一個(gè)call對(duì)象,參數(shù)就是Request請(qǐng)求對(duì)象Call call = okHttpClient.newCall(request);//4.請(qǐng)求加入調(diào)度,重寫(xiě)回調(diào)方法call.enqueue(new Callback() {//請(qǐng)求失敗執(zhí)行的方法@Overridepublic void onFailure(Call call, IOException e) {}//請(qǐng)求成功執(zhí)行的方法@Overridepublic void onResponse(Call call, Response response) throws IOException {}});上面就是發(fā)送一個(gè)異步GET請(qǐng)求的4個(gè)步驟:
注意事項(xiàng):
2.同步GET請(qǐng)求
//1.創(chuàng)建OkHttpClient對(duì)象OkHttpClient okHttpClient = new OkHttpClient();//2.創(chuàng)建Request對(duì)象,設(shè)置一個(gè)url地址(百度地址),設(shè)置請(qǐng)求方式。Request request = new Request.Builder().url("http://www.baidu.com").method("GET",null).build();//3.創(chuàng)建一個(gè)call對(duì)象,參數(shù)就是Request請(qǐng)求對(duì)象Call call = okHttpClient.newCall(request);//4.同步調(diào)用會(huì)阻塞主線(xiàn)程,這邊在子線(xiàn)程進(jìn)行new Thread(new Runnable() {@Overridepublic void run() {try {//同步調(diào)用,返回Response,會(huì)拋出IO異常Response response = call.execute();} catch (IOException e) {e.printStackTrace();}}}).start();同步GET請(qǐng)求和異步GET請(qǐng)求基本一樣,不同地方是同步請(qǐng)求調(diào)用Call的execute()方法,而異步請(qǐng)求調(diào)用call.enqueue()方法(具體2個(gè)方法的不同點(diǎn)我下一遍具體源碼詳解再說(shuō))。
3.POST請(qǐng)求提交鍵值對(duì)
//1.創(chuàng)建OkHttpClient對(duì)象OkHttpClient okHttpClient = new OkHttpClient();//2.通過(guò)new FormBody()調(diào)用build方法,創(chuàng)建一個(gè)RequestBody,可以用add添加鍵值對(duì) RequestBody requestBody = new FormBody.Builder().add("name","zhangqilu").add("age","25").build();//3.創(chuàng)建Request對(duì)象,設(shè)置URL地址,將RequestBody作為post方法的參數(shù)傳入Request request = new Request.Builder().url("url").post(requestBody).build();//4.創(chuàng)建一個(gè)call對(duì)象,參數(shù)就是Request請(qǐng)求對(duì)象Call call = okHttpClient.newCall(request);//5.請(qǐng)求加入調(diào)度,重寫(xiě)回調(diào)方法call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {}});上面就是一個(gè)異步POST請(qǐng)求提交鍵值對(duì)的5個(gè)步驟:
通過(guò)對(duì)比我們發(fā)現(xiàn)異步的POST請(qǐng)求和GET請(qǐng)求步驟很相似。
4.異步POST請(qǐng)求提交字符串
POST請(qǐng)求提交字符串和POST請(qǐng)求提交鍵值對(duì)非常相似,不同地方主要是RequestBody,下面我們來(lái)具體看一下。?
在有些情況下客戶(hù)端需要向服務(wù)端傳送字符串,我們?cè)撛趺醋?#xff1f;?
我們需要用到另一種方式來(lái)構(gòu)造一個(gè) RequestBody 如下所示:
5.異步POST請(qǐng)求上傳文件
我們這里舉一個(gè)上傳圖片的例子,也可以是其他文件如,TXT文檔等,不同地方主要是RequestBody,首先我們要添加存儲(chǔ)卡讀寫(xiě)權(quán)限,在 AndroidManifest.xml 文件中添加如下代碼:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>下面我們具體看一下上傳文件代碼。
//1.創(chuàng)建OkHttpClient對(duì)象OkHttpClient okHttpClient = new OkHttpClient();//上傳的圖片F(xiàn)ile file = new File(Environment.getExternalStorageDirectory(), "zhuangqilu.png");//2.通過(guò)RequestBody.create 創(chuàng)建requestBody對(duì)象,application/octet-stream 表示文件是任意二進(jìn)制數(shù)據(jù)流RequestBody requestBody =RequestBody.create(MediaType.parse("application/octet-stream"), file);//3.創(chuàng)建Request對(duì)象,設(shè)置URL地址,將RequestBody作為post方法的參數(shù)傳入Request request = new Request.Builder().url("url").post(requestBody).build();//4.創(chuàng)建一個(gè)call對(duì)象,參數(shù)就是Request請(qǐng)求對(duì)象Call call = okHttpClient.newCall(request);//5.請(qǐng)求加入調(diào)度,重寫(xiě)回調(diào)方法call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {}});6.異步GET請(qǐng)求下載文件
下載文件也是我們經(jīng)常用到的功能,我們就舉個(gè)下載圖片的例子吧
//1.創(chuàng)建OkHttpClient對(duì)象OkHttpClient okHttpClient = new OkHttpClient();//2.創(chuàng)建Request對(duì)象,設(shè)置一個(gè)url地址(百度地址),設(shè)置請(qǐng)求方式。Request request = new Request.Builder().url("https://www.baidu.com/img/bd_logo1.png").get().build();//3.創(chuàng)建一個(gè)call對(duì)象,參數(shù)就是Request請(qǐng)求對(duì)象Call call = okHttpClient.newCall(request);//4.請(qǐng)求加入調(diào)度,重寫(xiě)回調(diào)方法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 {//拿到字節(jié)流InputStream is = response.body().byteStream();int len = 0;//設(shè)置下載圖片存儲(chǔ)路徑和名稱(chēng)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請(qǐng)求下載文件還是比較簡(jiǎn)單,設(shè)置下載地址,在回調(diào)函數(shù)中拿到了圖片的字節(jié)流,然后保存為了本地的一張圖片。
從網(wǎng)絡(luò)下載一張圖片并直接設(shè)置到ImageView中。
@Override public void onResponse(Call call, Response response) throws IOException {InputStream is = response.body().byteStream();//使用 BitmapFactory 的 decodeStream 將圖片的輸入流直接轉(zhuǎn)換為 Bitmap final Bitmap bitmap = BitmapFactory.decodeStream(is);//在主線(xiàn)程中操作UIrunOnUiThread(new Runnable() {@Overridepublic void run() {//然后將Bitmap設(shè)置到 ImageView 中imageView.setImageBitmap(bitmap);}});is.close(); }主要注釋已在代碼中了。
7.異步POST請(qǐng)求上傳Multipart文件
我們?cè)谟行┣闆r下既要上傳文件還要上傳其他類(lèi)型字段。比如在個(gè)人中心我們可以修改名字,年齡,修改圖像,這其實(shí)就是一個(gè)表單。這里我們用到MuiltipartBody ,它 是RequestBody 的一個(gè)子類(lèi),我們提交表單就是利用這個(gè)類(lèi)來(lái)構(gòu)建一個(gè) RequestBody,我們來(lái)看一下具體代碼。
//1.創(chuàng)建OkHttpClient對(duì)象OkHttpClient okHttpClient = new OkHttpClient();//上傳的圖片F(xiàn)ile file = new File(Environment.getExternalStorageDirectory(), "zhuangqilu.png");//2.通過(guò)new MultipartBody build() 創(chuàng)建requestBody對(duì)象,RequestBody requestBody = new MultipartBody.Builder()//設(shè)置類(lèi)型是表單.setType(MultipartBody.FORM)//添加數(shù)據(jù).addFormDataPart("username","zhangqilu").addFormDataPart("age","25").addFormDataPart("image","zhangqilu.png", RequestBody.create(MediaType.parse("image/png"),file)).build();//3.創(chuàng)建Request對(duì)象,設(shè)置URL地址,將RequestBody作為post方法的參數(shù)傳入Request request = new Request.Builder().url("url").post(requestBody).build();//4.創(chuàng)建一個(gè)call對(duì)象,參數(shù)就是Request請(qǐng)求對(duì)象Call call = okHttpClient.newCall(request);//5.請(qǐng)求加入調(diào)度,重寫(xiě)回調(diào)方法call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {}});注意事項(xiàng)
三 結(jié)束
Android OkHttp3簡(jiǎn)介和使用詳解就到這里了,下一篇我們分析 OkHttp3源碼。
版權(quán)聲明:
本文為原作者原創(chuàng)文章,此處轉(zhuǎn)載僅學(xué)習(xí)研究。
原文地址:https://blog.csdn.net/zhangqiluGrubby/article/details/71480546
總結(jié)
以上是生活随笔為你收集整理的Android OkHttp3简介和使用详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 用Swashbuckle(swagger
- 下一篇: WEBAPI 增加身份验证 (OAUTH