MasterofProject

Android an improved okHttp package library

Label AndroidOkhttp
28698 people read comment(108) Collection Report
Classification:

Reproduced please indicate the source:
Http://prog3.com/sbdm/blog/lmj623565791/article/details/49734867;
This article from:[Zhang Hongyang's blog]

First, an overview

Before writing the articleOkHttp Android complete parsing is the time to learn about OkHttp. in fact, the main as okhttp the popularity of the, of course, there is also a simple package tools, did not expect the attention and use of the person also very much, because of the enthusiasm, this class of methods is also increasing, a variety of overloaded methods that to use up very inconvenient, really ashamed.

So, in this weekend, take some time for the tool class, the dismantling and preparation of the new, by the way to improve the function, as far as possible to enhance the use of convenience and ease of.

Title Improvement, but also refers to the code before me to improve.

If you don't know about okhttp, you can passOkHttp Android complete parsing is the time to learn about OkHttpTo understand.

OK, then at present, the package library will support:

  • General get request
  • General post request
  • File upload based on Http
  • File download
  • Upload download progress callback
  • Load image
  • Supports the request callback, directly returns the object, the object set
  • Support for session retention
  • Support the self signing site HTTPS access, provide methods to set the certificate on the line
  • Support to cancel a request

Source address:Https://github.com/hongyangAndroid/okhttp-utils


Introduce

  • Studio Android

    Before using, for Studio Android users, you can choose to add:

    CompileProject (': okhttputils')

    perhaps

    Compile'com.zhy:okhttputils:2.0.0'
  • Eclipse

    Copy source code for their own.

Two, basic usage

The basic usage format is:

OkHttpUtils
(.Get)
.url (URL)
.addParams ("Username","Hyman")
.addParams ("Password","123")
.build ()
.execute (callback);

Through the chain to add various parameters according to their own needs, the last call execute (callback) to perform, the incoming callback is represented by asynchronous. If the execute () represents the method of synchronization call.

We can see that, before the abolition of a pile of get overloading method, parameters can be a flexible choice of.

The following simple look, all of the use of:

(1) GET request

URL String ="Http://prog3.com/";
OkHttpUtils
(.Get)
.url (URL)
.addParams ("Username","Hyman")
.addParams ("Password","123")
.build ()
.execute (NewStringCallback ()
{
                @Override
                Public Void OnError(request Exception, e Request)
{

}

                @Override
                Public Void OnResponse(response String)
{

}
});

(2) POST request

OkHttpUtils
.post ()
.url (URL)
.addParams ("Username","Hyman")
.addParams ("Password","123")
.build ()
.execute (callback);

(3) String Post

OkHttpUtils
    .postString()
    .url(URL)
    .content(Gson new ().toJson(User new ("Zhy","123")))
    .build()
    .execute(MyStringCallback new ());

String as a request to the server into the server, such as JSON string.

(4) File Post

OkHttpUtils
    .postFile()
    .url(URL)
    .file(file)
    .build()
    .execute(MyStringCallback new ());

File as a request to the server into the server.

(5) file upload based on POST (similar to the web on the form)

OkHttpUtils.post ()/ /
.addFile ("MFile","Messenger_01.png"File)/ /
.addFile ("MFile","Test1.txt"File2)/ /
.url (URL)
.params (params)/ /
.headers (headers)/ /
.build ()/ /
.execute (NewMyStringCallback ());

(6) download the file

OkHttpUtils/ /
(.Get)/ /
.url (URL)/ /
.build ()/ /
.execute (NewFileCallBack (Environment.getExternalStorageDirectory ().GetAbsolutePath (),"Gson-2.2.1.jar")/ /
{
        @Override
        Public Void InProgress(进展)
{
mprogressbar。设置任务的进度((int)(一百*进展);
}

        “重写”
        公共 无效 误差(请求请求,例外)
{
日志:电子标签,“错误:”+大肠getmessage());
}

        “重写”
        公共 无效 响应(文件文件)
{
日志:电子标签,“响应:“+文件getabsolutepath());
}
});

(7)显示图片

okhttputils
get()。/ / / /
网址(网址)/ / / /
build()。/ / / /
执行(新的bitmapcallback()
{
        “重写”
        公共 无效 误差(请求请求,例外)
{
setText(MTV。“错误:”+大肠getmessage());
}

        “重写”
        公共 无效 响应(位图位图)
{
mimageview setimagebitmap(位图);
}
});

哈,目前来看,清晰多了。

三、对于上传下载的回调

新的回叫?()
{
    / / / /…
    “重写”
    公共 无效 进展)
{
       / /使用进展:0 1
}
}

对于传入的回调有个在方法,需要拿到进度直接复写该方法即可。

四、对于自动解析为实体类

目前去除了gson的依赖,提供了自定义回调的方式,让用户自己去解析返回的数据,目前提供了stringcallbackfilecallbackbitmapcallback分别用于返回字符串,文件下载,加载图片。

当然如果你希望解析为对象,你可以:

公共 摘要  usercallback 延伸 回调<用户>
{
    / /非UI线程,支持任何耗时操作
    “重写”
    公共用户parsenetworkresponse(响应)抛出IOException
{
字符串=响应。body()。string();
用户用户=新的gson()。fromjson(字符串,用户类);
        返回用户;
}
}

自己使用自己喜欢的JSON解析库完成即可。

解析成列表<用户>,则如下:

公共 摘要  listusercallback 延伸 回调<列表<用户>
{
“重写”
    公共 列表<用户> parsenetworkresponse(反应)抛出IOException
{
字符串=响应。body()。string();
        列表<用户>用户=新的gson() fromjson(串,列表类);
        返回用户;
}


}

五、对于HTTPS单向认证

非常简单,拿到证书的证书XXX。

然后调用


okhttputils。getinstance()
setcertificates(InputStream);

建议使用方式,例如我的证书放在资产目录:


* * * *
*由ZHY 15 / 8 / 25。
*
公共  我的申请 延伸 应用
{
    “重写”
    公共 无效 onCreate()
{
        好极了oncreate();

        试试看
{
okhttputils
getinstance()。
。setcertificates(getassets()开放(。“AAA。CER”),
getassets()开放(。“服务器。CER”);
}抓住(一次)
{
E. printstacktrace();
}
}
}

即可别忘了注册应用。

注意:如果HTTPS网站为权威机构颁发的证书,不需要以上设置。自签名的证书才需要。

六、配置

(1)全局配置

可以在应用中,通过:

okhttpclient客户端=
okhttputils。getinstance()。getokhttpclient();

然后调用客户端的各种集方法。

例如:

setconnecttimeout(客户端。十万timeunit毫秒),;

(2)为单个请求设置超时

比如涉及到文件的需要设置读写等待时间多一点。

okhttputils
get()。/ / / /
网址(网址)/ / / /
标签(/ / / /
build()。/ / / /
conntimeout(。二万)
readtimeout(。二万)
writetimeout(。二万)
execute()。

调用build()之后,可以随即设置各种超时。

(3)取消单个请求

请求呼叫电话= okhttputils。get()。网址(URL)。build();
cancel()呼叫;

(4)根据标签取消请求

目前对于支持的方法都添加了最后一个参数对象标记,取消则通过okhttputils canceltag(标签)。执行。

例如:在活动中,当活动销毁取消请求:

okhttputils
get()。/ / / /
网址(网址)/ / / /
标签(/ / / /
build()。/ / / /

“重写”
受保护的 无效 onDestroy()
{
    好极了ondestroy();
    / /可以取消同一个标签的
okhttputils canceltag(。);/ /取消以活动。这作为标签的请求
}

比如,当前活动页面所有的请求以活动对象作为标签,可以在ondestory里面统一取消。

七、浅谈封装

其实整个封装的过程比较简单,这里简单描述下,对于okhttp一个请求的流程大致是这样的:

/ /创建okhttpclient对象
okhttpclient mokhttpclient =新的okhttpclient();
/ /创建一个请求
最后请求请求新的builder()请求。
网址(“https://github.com/hongyangandroid”)
build();
/ /新呼叫
调用= mokhttpclient newcall(请求);
/ /请求加入调度
电话。入队(新的callback()
{
    “重写”
    公共 无效 故障(请求,IOException e)
{
}

    “重写”
    公共 无效 响应最后响应响应抛出IOException
{
            / /串htmlstr =响应。body()。string();
}
});

其中主要的差异,其实就是请求的构建过程。

我对请求抽象了一个类:okhttprequest

公共 摘要  okhttprequest
{
    受保护的requestbody requestbody;
    受保护的请求请求;

    受保护的字符串网址;
    受保护的字符串标记;
    受保护的图<字符串,字符串>参数;
    受保护的图<字符串,字符串>头文件;

    受保护的 okhttprequest(字符串网址,字符串标记,
图<字符串,字符串>参数,地图<字符串,字符串>头)
{
        网址=网址;
        标签=标签;
        params参数=;
        头=头;
}

    受保护的 摘要请求buildrequest();
    受保护的 摘要requestbodybuildrequestbody();

    受保护的 无效 prepareinvoked(resultcallback回调)
{
requestbody = buildrequestbody();
requestbody = wraprequestbody(requestbody,回调);
buildrequest()请求=;
}

    受保护的requestbodywraprequestbody(requestbody requestbody,最后resultcallback回调)
{
        返回requestbody;
}


    公共 无效 invokeasyn(resultcallback回调)
{
prepareinvoked(回调);
mokhttpclientmanager执行(要求回调);
}


     其他常用方法
}

一个请求的构建呢,我分三个步骤:buildrequestbodywraprequestbodybuildrequest这样的次序,当以上三个方法没有问题时,我们就拿到了请求,然后执行即可。

但是对于不同的请求,requestbody以及请求的构建过程是不同的,所以大家可以看到buildrequestbodybuildrequest为抽象的方法,也就是不同的请求类,比如okhttpgetrequestokhttppostrequest等需要自己去构建自己的请求。

对于wraprequestbody方法呢,可以看到它默认基本属于空实现,主要是因为并非所有的请求类都需要复写它,只有上传的时候呢,需要回调进度,需要对requestbody进行包装,所以这个方法类似于一个钩子。

其实这个过程有点类似模板方法模式,有兴趣可以看看一个短篇介绍设计模式模版方法模式展现程序员的一天

对于更加详细的用法,可以查看GitHub上面的自述,以及演示,演示包含目前:

对于上传文件的两个按钮,需要自己搭建服务器,其他的按钮可以直接测试。

最后,由于本人水平有限,以及时间比较仓促~ ~发现问题,欢迎提问题,我会抽时间解决。有个美好的一天~

源码点击下载


欢迎关注我的微博:
http://weibo.com/u/3165018720


群号:五亿一千四百四十四万七千五百八十,欢迎入群

微信公众号:hongyangandroid
(欢迎关注,第一时间推送博文信息)

四十
猜你在找
查看评论
*以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:5528616次
    • 积分:三万四千九百五十九
    • 等级:
    • 排名:67名第
    • 原创:175篇
    • 转载:0篇
    • 译文:6篇
    • 评论:8383条
    我的微信公众号
    长期为您推荐优秀博文、开源项目、视频等,进入还有好玩的等着你,欢迎扫一扫。
    联系方式


    QQ群:
    • 五千五百零三万二千六百七十五
    • 四亿二千三百三十七万二千八百二十四
    • 四亿二千九百七十五万七千零六十八
    • 二亿六千四百九十五万零四百二十四
    • 四亿六千三百零八万一千六百六十
    • 请勿重复加群,谢谢
    My micro blog
    Blog column
    Latest comments