編輯:關於android開發
之前寫了篇Android OkHttp完全解析 是時候來了解OkHttp了,其實主要是作為okhttp的普及文章,當然裡面也簡單封裝了工具類,沒想到關注和使用的人還挺多的,由於這股熱情,該工具類中的方法也是劇增,各種重載方法,以致於使用起來極不方便,實在慚愧。
於是,在這個周末,抽點時間對該工具類,進行了重新的拆解與編寫,順便完善下功能,盡可能的提升其使用起來的方便性和易擴展性。
標題的改善,也是指的是對於我之前的代碼進行改善。
如果你對okhttp不了解,可以通過Android OkHttp完全解析 是時候來了解OkHttp了進行了解。
ok,那麼目前,該封裝庫志支持:
一般的get請求 一般的post請求 基於Http的文件上傳 文件下載 上傳下載的進度回調 加載圖片 支持請求回調,直接返回對象、對象集合 支持session的保持 支持自簽名網站https的訪問,提供方法設置下證書就行 支持取消某個請求源碼地址:https://github.com/hongyangAndroid/okhttp-utils
引入:
Android Studio
使用前,對於Android Studio的用戶,可以選擇添加:
compile project(':okhttputils')
主項目中無需再引用okhttp的依賴,也不需要再額外導入Gson的lib.
Eclipse
下載okhttputils.jar,添加到項目libs,同時需要下載okhttp.jar和gson-2.2.1.jar
目前基本的用法格式為:
new OkHttpRequest.Builder()
.url(url)
.params(params)
.headers(headers)
.tag(tag)
.get(callback);
通過Builder去根據自己的需要添加各種參數,最後調用get(callback)進行執行,傳入callback則代表是異步。如果單純的get()則代表同步的方法調用。
可以看到,取消了之前一堆的get重載方法,參數也可以進行靈活的選擇了。
類似的,除了get方法,還有post、upload、download、displayImage。用法基本都一致。下面簡單看一下。
//最基本
new OkHttpRequest.Builder()
.url(url)
.get(callback);
//擴展
new OkHttpRequest.Builder()
.url(url)
.params(params)
.headers(headers)
.tag(tag)
.get(callback);
//最基本
new OkHttpRequest.Builder()
.url(url)
.params(params)
.post(callback);
//擴展
new OkHttpRequest.Builder()
.url(url)
.params(params)
.headers(headers)
.tag(tag)
.post(callback);
//基本
new OkHttpRequest.Builder()
.url(url)
.files(files)
.upload(callback);
//擴展
new OkHttpRequest.Builder()
.url(url)
.params(params)
.headers(headers)
.tag(tag)
.files(files)
.upload(callback);
//基本
new OkHttpRequest.Builder()
.url(url)
.destFileDir(destFileDir)
.destFileName(destFileName)
.download(callback);
//擴展
new OkHttpRequest.Builder()
.url(url)
.params(params)
.headers(headers)
.tag(tag)
.destFileDir(destFileDir)
.destFileName(destFileName)
.download(callback);
//基本
new OkHttpRequest.Builder()
.url(url)
.imageview(imageView)
.displayImage(callback);
//擴展
new OkHttpRequest.Builder()
.url(url)
.params(params)
.headers(headers)
.tag(tag)
.imageview(imageView)
.errorResId(errorResId)
.displayImage(callback);
會自動根據ImageView的大小進行壓縮。
哈,目前來看,清晰多了。
new ResultCallback>()
{
//...
@Override
public void inProgress(float progress)
{
//use progress: 0 ~ 1
}
}
對於傳入的callback有個inProgress方法,當調用upload(callback),download(callback)方法時,progress回調0~1.(UI線程)。
//對象
new ResultCallback ()
{
//...
@Override
public void onResponse(User user)
{
mTv.setText(user.username);
}
}
//集合
new ResultCallback>()
{
//...
@Override
public void onResponse(List users)
{
mTv.setText(users.get(0).username);
}
}
目前支持單個對象,或者集合,內部依賴Gson完成。
注意:泛型一定要設置,如果你不需要轉化為實體對象,就寫new ResultCallback
,
非常簡單,拿到xxx.cert的證書。
然後調用
OkHttpClientManager.getInstance()
.getHttpsDelegate()
.setCertificates(inputstream);
建議使用方式,例如我的證書放在assets目錄:
/**
* Created by zhy on 15/8/25.
*/
public class MyApplication extends Application
{
@Override
public void onCreate()
{
super.onCreate();
try
{
OkHttpClientManager.getInstance()
.getHttpsDelegate()
.setCertificates(getAssets().open(aaa.cer),
getAssets().open(server.cer));
} catch (IOException e)
{
e.printStackTrace();
}
}
}
即可。別忘了注冊Application。
注意:如果https網站為權威機構頒發的證書,不需要以上設置。自簽名的證書才需要。
其實整個封裝的過程比較簡單,這裡簡單描述下,對於okhttp一個請求的流程大致是這樣的:
//創建okHttpClient對象
OkHttpClient mOkHttpClient = new OkHttpClient();
//創建一個Request
final Request request = new Request.Builder()
.url(https://github.com/hongyangAndroid)
.build();
//new call
Call call = mOkHttpClient.newCall(request);
//請求加入調度
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();
}
});
其中主要的差異,其實就是request的構建過程。
我對Request抽象了一個類:OkHttpRequest
public abstract class OkHttpRequest
{
protected RequestBody requestBody;
protected Request request;
protected String url;
protected String tag;
protected Map params;
protected Map headers;
protected OkHttpRequest(String url, String tag,
Map params, Map 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
}
一個request的構建呢,我分三個步驟:buildRequestBody
, wrapRequestBody
,buildRequest
這樣的次序,當以上三個方法沒有問題時,我們就拿到了request,然後執行即可。
但是對於不同的請求,requestBody以及request的構建過程是不同的,所以大家可以看到buildRequestBody
,buildRequest
為抽象的方法,也就是不同的請求類,比如OkHttpGetRequest
、OkHttpPostRequest
等需要自己去構建自己的request。
對於wrapRequestBody
方法呢,可以看到它默認基本屬於空實現,主要是因為並非所有的請求類都需要復寫它,只有上傳的時候呢,需要回調進度,需要對requestBody進行包裝,所以這個方法類似於一個鉤子。
其實這個過程有點類似模板方法模式,有興趣可以看看一個短篇介紹設計模式 模版方法模式 展現程序員的一天 .
對於更加詳細的用法,可以查看github上面的readme,以及demo,目前demo包含:
對於上傳文件的兩個按鈕,需要自己搭建服務器,其他的按鈕可以直接測試。
最後,由於本人水平有限,以及時間比較倉促~~發現問題,歡迎提issue,我會抽時間解決。 have a nice day ~
Android_安卓為按鈕控件綁定事件的五種方式,android按鈕控件一、寫在最前面 本次,來介紹一下安卓中為控件--Button綁定事件的五種方式。 二、具體
Android開發藝術探索學習筆記(三),android藝術探索第三章 View的事件體系 3.1 View基礎知識 3.1.1 什麼是view
關於TCP MSS的內核設置下面是一個MSS交互的例子,在三次握手的過程中兩個主機捎帶了不同的MSS值,192.168.189.22接口的MTU值為1500,192.16
Android 自定義View之自繪控件,androidview繪控件首先要提前聲明一下,我對於自定義View的理解並不是很深,最近啃了幾天guolin博主寫的關於自定義
基於CoordinatorLayout實現向上滾動導航條ToolBar滾
Adroid: getExternalStorageDirectory