Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 一個改善的okHttp封裝庫

Android 一個改善的okHttp封裝庫

編輯:關於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。用法基本都一致。下面簡單看一下。

(1)GET請求

//最基本
new OkHttpRequest.Builder()
    .url(url)
    .get(callback);
//擴展
new OkHttpRequest.Builder()
    .url(url)
    .params(params)
    .headers(headers)
    .tag(tag)
    .get(callback);

(2)POST請求

//最基本
new OkHttpRequest.Builder()
    .url(url)
    .params(params)
    .post(callback);
//擴展
new OkHttpRequest.Builder()
    .url(url)
    .params(params)
    .headers(headers)
    .tag(tag)
    .post(callback);

(3)基於POST的文件上傳

//基本
new OkHttpRequest.Builder()
    .url(url)
    .files(files)
    .upload(callback);
//擴展
new OkHttpRequest.Builder()
    .url(url)
    .params(params)
    .headers(headers)
    .tag(tag)
    .files(files)
    .upload(callback);

(4)下載文件

//基本
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);

(5)顯示圖片

//基本
 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(){}

五、對於https單向認證

非常簡單,拿到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為抽象的方法,也就是不同的請求類,比如OkHttpGetRequestOkHttpPostRequest等需要自己去構建自己的request。

對於wrapRequestBody方法呢,可以看到它默認基本屬於空實現,主要是因為並非所有的請求類都需要復寫它,只有上傳的時候呢,需要回調進度,需要對requestBody進行包裝,所以這個方法類似於一個鉤子。

其實這個過程有點類似模板方法模式,有興趣可以看看一個短篇介紹設計模式 模版方法模式 展現程序員的一天 .

對於更加詳細的用法,可以查看github上面的readme,以及demo,目前demo包含:

對於上傳文件的兩個按鈕,需要自己搭建服務器,其他的按鈕可以直接測試。

最後,由於本人水平有限,以及時間比較倉促~~發現問題,歡迎提issue,我會抽時間解決。 have a nice day ~

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved