Android開發(fā)之OkHttpUtils的具體使用方法
一、概述
之前寫了篇Android OkHttp完全解析 是時(shí)候來了解OkHttp了,其實(shí)主要是作為okhttp的普及文章,當(dāng)然里面也簡單封裝了工具類,沒想到關(guān)注和使用的人還挺多的,由于這股熱情,該工具類中的方法也是劇增,各種重載方法,以致于使用起來極不方便,實(shí)在慚愧。
于是,在這個(gè)周末,抽點(diǎn)時(shí)間對該工具類,進(jìn)行了重新的拆解與編寫,順便完善下功能,盡可能的提升其使用起來的方便性和易擴(kuò)展性。
ok,那么目前,該封裝庫志支持:
- 一般的get請求
- 一般的post請求
- 基于Http的文件上傳
- 文件下載
- 上傳下載的進(jìn)度回調(diào)
- 加載圖片
- 支持請求回調(diào),直接返回對象、對象集合
- 支持session的保持
- 支持自簽名網(wǎng)站https的訪問,提供方法設(shè)置下證書就行
- 支持取消某個(gè)請求
源碼地址:https://github.com/hongyangAndroid/okhttp-utils
引入:
Android Studio
使用前,對于Android Studio的用戶,可以選擇添加:
compile project(':okhttputils')
或者
compile 'com.zhy:okhttputils:2.0.0'
二、基本用法
目前基本的用法格式為:
OkHttpUtils .get() .url(url) .addParams("username", "hyman") .addParams("password", "123") .build() .execute(callback);
通過鏈?zhǔn)饺ジ鶕?jù)自己的需要添加各種參數(shù),最后調(diào)用execute(callback)進(jìn)行執(zhí)行,傳入callback則代表是異步。如果單純的execute()則代表同步的方法調(diào)用。
可以看到,取消了之前一堆的get重載方法,參數(shù)也可以進(jìn)行靈活的選擇了。
下面簡單看一下,全部的用法:
(1)GET請求
String url = "http://www.csdn.net/"; OkHttpUtils .get() .url(url) .addParams("username", "hyman") .addParams("password", "123") .build() .execute(new StringCallback() { @Override public void onError(Request request, Exception e) { } @Override public void onResponse(String response) { } });
(2)POST請求
OkHttpUtils .post() .url(url) .addParams("username", "hyman") .addParams("password", "123") .build() .execute(callback);
(3)Post String
OkHttpUtils .postString() .url(url) .content(new Gson().toJson(new User("zhy", "123"))) .build() .execute(new MyStringCallback());
將string作為請求體傳入到服務(wù)端,例如json字符串。
(4)Post File
OkHttpUtils .postFile() .url(url) .file(file) .build() .execute(new MyStringCallback());
將file作為請求體傳入到服務(wù)端.
(5)基于POST的文件上傳(類似web上的表單)
OkHttpUtils.post()// .addFile("mFile", "messenger_01.png", file)// .addFile("mFile", "test1.txt", file2)// .url(url) .params(params)// .headers(headers)// .build()// .execute(new MyStringCallback());
(6)下載文件
OkHttpUtils// .get()// .url(url)// .build()// .execute(new FileCallBack(Environment.getExternalStorageDirectory().getAbsolutePath(), "gson-2.2.1.jar")// { @Override public void inProgress(float progress) { mProgressBar.setProgress((int) (100 * progress)); } @Override public void onError(Request request, Exception e) { Log.e(TAG, "onError :" + e.getMessage()); } @Override public void onResponse(File file) { Log.e(TAG, "onResponse :" + file.getAbsolutePath()); } });
(7)顯示圖片
OkHttpUtils .get()// .url(url)// .build()// .execute(new BitmapCallback() { @Override public void onError(Request request, Exception e) { mTv.setText("onError:" + e.getMessage()); } @Override public void onResponse(Bitmap bitmap) { mImageView.setImageBitmap(bitmap); } });
哈,目前來看,清晰多了。
三、對于上傳下載的回調(diào)
new Callback<?>() { //... @Override public void inProgress(float progress) { //use progress: 0 ~ 1 } }
對于傳入的callback有個(gè)inProgress方法,需要拿到進(jìn)度直接復(fù)寫該方法即可。
四、對于自動解析為實(shí)體類
目前去除了Gson的依賴,提供了自定義Callback的方式,讓用戶自己去解析返回的數(shù)據(jù),目前提供了StringCallback,F(xiàn)ileCallback,BitmapCallback 分別用于返回string,文件下載,加載圖片。
當(dāng)然如果你希望解析為對象,你可以:
public abstract class UserCallback extends Callback<User> { //非UI線程,支持任何耗時(shí)操作 @Override public User parseNetworkResponse(Response response) throws IOException { String string = response.body().string(); User user = new Gson().fromJson(string, User.class); return user; } }
自己使用自己喜歡的Json解析庫完成即可。
解析成List<User>,則如下:
public abstract class ListUserCallback extends Callback<List<User>> { @Override public List<User> parseNetworkResponse(Response response) throws IOException { String string = response.body().string(); List<User> user = new Gson().fromJson(string, List.class); return user; } }
五、對于https單向認(rèn)證
非常簡單,拿到xxx.cert的證書。
然后調(diào)用
OkHttpUtils.getInstance() .setCertificates(inputstream);
建議使用方式,例如我的證書放在assets目錄:
/** * Created by zhy on 15/8/25. */ public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); try { OkHttpUtils .getInstance() .setCertificates(getAssets().open("aaa.cer"), getAssets().open("server.cer")); } catch (IOException e) { e.printStackTrace(); } } }
即可。別忘了注冊Application。
注意:如果https網(wǎng)站為權(quán)威機(jī)構(gòu)頒發(fā)的證書,不需要以上設(shè)置。自簽名的證書才需要。
六、配置
(1)全局配置
可以在Application中,通過:
OkHttpClient client = OkHttpUtils.getInstance().getOkHttpClient();
然后調(diào)用client的各種set方法。
例如:
client.setConnectTimeout(100000, TimeUnit.MILLISECONDS);
(2)為單個(gè)請求設(shè)置超時(shí)
比如涉及到文件的需要設(shè)置讀寫等待時(shí)間多一點(diǎn)。
OkHttpUtils .get()// .url(url)// .tag(this)// .build()// .connTimeOut(20000) .readTimeOut(20000) .writeTimeOut(20000) .execute()
調(diào)用build()之后,可以隨即設(shè)置各種timeOut.
(3)取消單個(gè)請求
RequestCall call = OkHttpUtils.get().url(url).build(); call.cancel()
(4)根據(jù)tag取消請求
目前對于支持的方法都添加了最后一個(gè)參數(shù)Object tag,取消則通過OkHttpUtils.cancelTag(tag)執(zhí)行。
例如:在Activity中,當(dāng)Activity銷毀取消請求:
OkHttpUtils .get()// .url(url)// .tag(this)// .build()// @Override protected void onDestroy() { super.onDestroy(); //可以取消同一個(gè)tag的 OkHttpUtils.cancelTag(this);//取消以Activity.this作為tag的請求 }
比如,當(dāng)前Activity頁面所有的請求以Activity對象作為tag,可以在onDestory里面統(tǒng)一取消。
七、淺談封裝
其實(shí)整個(gè)封裝的過程比較簡單,這里簡單描述下,對于okhttp一個(gè)請求的流程大致是這樣的:
//創(chuàng)建okHttpClient對象 OkHttpClient mOkHttpClient = new OkHttpClient(); //創(chuàng)建一個(gè)Request final Request request = new Request.Builder() .url("https://github.com/hongyangAndroid") .build(); //new call Call call = mOkHttpClient.newCall(request); //請求加入調(diào)度 call.enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) { } @Override public void onResponse(final Response response) throws IOException { //String htmlStr = response.body().string(); } });
其中主要的差異,其實(shí)就是request的構(gòu)建過程。
我對Request抽象了一個(gè)類:OkHttpRequest
public abstract class OkHttpRequest { protected RequestBody requestBody; protected Request request; protected String url; protected String tag; protected Map<String, String> params; protected Map<String, String> headers; protected OkHttpRequest(String url, String tag, Map<String, String> params, Map<String, String> headers) { this.url = url; this.tag = tag; this.params = params; this.headers = headers; } protected abstract Request buildRequest(); protected abstract RequestBody buildRequestBody(); protected void prepareInvoked(ResultCallback callback) { requestBody = buildRequestBody(); requestBody = wrapRequestBody(requestBody, callback); request = buildRequest(); } protected RequestBody wrapRequestBody(RequestBody requestBody, final ResultCallback callback) { return requestBody; } public void invokeAsyn(ResultCallback callback) { prepareInvoked(callback); mOkHttpClientManager.execute(request, callback); } // other common methods }
一個(gè)request的構(gòu)建呢,我分三個(gè)步驟:buildRequestBody , wrapRequestBody ,buildRequest這樣的次序,當(dāng)以上三個(gè)方法沒有問題時(shí),我們就拿到了request,然后執(zhí)行即可。
但是對于不同的請求,requestBody以及request的構(gòu)建過程是不同的,所以大家可以看到buildRequestBody ,buildRequest為抽象的方法,也就是不同的請求類,比如OkHttpGetRequest、OkHttpPostRequest等需要自己去構(gòu)建自己的request。
對于wrapRequestBody方法呢,可以看到它默認(rèn)基本屬于空實(shí)現(xiàn),主要是因?yàn)椴⒎撬械恼埱箢惗夹枰獜?fù)寫它,只有上傳的時(shí)候呢,需要回調(diào)進(jìn)度,需要對requestBody進(jìn)行包裝,所以這個(gè)方法類似于一個(gè)鉤子。
其實(shí)這個(gè)過程有點(diǎn)類似模板方法模式。
對于更加詳細(xì)的用法,可以查看github上面的readme,以及demo,目前demo包含:
對于上傳文件的兩個(gè)按鈕,需要自己搭建服務(wù)器,其他的按鈕可以直接測試。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android使用OKHttp庫實(shí)現(xiàn)視頻文件的上傳到服務(wù)器功能
- Android Okhttp請求查詢購物車的實(shí)例代碼
- Android 封裝Okhttp+Retrofit+RxJava,外加攔截器實(shí)例
- android 開發(fā)中使用okhttp上傳文件到服務(wù)器
- Android okhttp3.0忽略https證書的方法
- Android使用OkHttp請求自簽名的https網(wǎng)站的示例
- Android中okhttp3使用詳解
- android通過okhttpClient下載網(wǎng)頁內(nèi)容的實(shí)例代碼
- Android OKHTTP的單例和再封裝的實(shí)例
- Android中實(shí)現(xiàn)OkHttp上傳文件到服務(wù)器并帶進(jìn)度
- android中實(shí)現(xiàn)OkHttp下載文件并帶進(jìn)度條
- Android使用OKHTTP解析JSON數(shù)據(jù)的實(shí)例代碼
- Android使用OkHttp上傳圖片的實(shí)例代碼
- Android OkHttp 結(jié)合php 多圖片上傳實(shí)例
- 詳解Android中OkHttp3的例子和在子線程更新UI線程的方法
- android Retrofit2+okHttp3使用總結(jié)
- Android OkHttp Post上傳文件并且攜帶參數(shù)實(shí)例詳解
- Android OkHttp基本使用詳解
相關(guān)文章
五分了解Android?Progress?Bar進(jìn)度條加載
這篇文章主要為大家介紹了Android?Progress?Bar進(jìn)度條加載的實(shí)現(xiàn)及屬性示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02- 這篇文章主要為大家詳細(xì)介紹了Android中Handler機(jī)制的使用,文中的示例代碼講解詳細(xì),有需要的朋友可以借鑒參考下,希望能夠?qū)Υ蠹矣兴鶐椭?/div> 2022-11-11
Android 使用ViewPager實(shí)現(xiàn)左右循環(huán)滑動及輪播效果
ViewPager是一個(gè)常用的Android組件,不過通常我們使用ViewPager的時(shí)候不能實(shí)現(xiàn)左右無限循環(huán)滑動,在滑到邊界的時(shí)候會看到一個(gè)不能翻頁的動畫,可能影響用戶體驗(yàn),接下來通過本文給大家介紹Android 使用ViewPager實(shí)現(xiàn)左右循環(huán)滑動及輪播效果,一起看看吧2017-02-02Android編程實(shí)現(xiàn)手機(jī)震動功能的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)手機(jī)震動功能的方法,結(jié)合實(shí)例形式分析了Android實(shí)現(xiàn)手機(jī)震動功能的核心代碼與權(quán)限控制操作技巧,需要的朋友可以參考下2017-06-06flutter升級3.7.3報(bào)錯(cuò)Unable?to?find?bundled?Java?version解決
這篇文章主要介紹了flutter升級3.7.3報(bào)錯(cuò)Unable?to?find?bundled?Java?version解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加2023-02-02最新評論