博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 一个改善的okHttp封装库
阅读量:6479 次
发布时间:2019-06-23

本文共 7239 字,大约阅读时间需要 24 分钟。

hot3.png

一、概述

之前写了篇,其实主要是作为okhttp的普及文章,当然里面也简单封装了工具类,没想到关注和使用的人还挺多的,由于这股热情,该工具类中的方法也是剧增,各种重载方法,以致于使用起来极不方便,实在惭愧。

于是,在这个周末,抽点时间对该工具类,进行了重新的拆解与编写,顺便完善下功能,尽可能的提升其使用起来的方便性和易扩展性。

标题的改善,也是指的是对于我之前的代码进行改善。

如果你对okhttp不了解,可以通过进行了解。

ok,那么目前,该封装库志支持:

  • 一般的get请求
  • 一般的post请求
  • 基于Http的文件上传
  • 文件下载
  • 上传下载的进度回调
  • 加载图片
  • 支持请求回调,直接返回对象、对象集合
  • 支持session的保持
  • 支持自签名网站https的访问,提供方法设置下证书就行
  • 支持取消某个请求

源码地址:

引入:

  •  Studio

    使用前,对于Android Studio的用户,可以选择添加:

compile project(':okhttputils')

或者

compile 'com.zhy:okhttputils:2.0.0'

Eclipse

自行copy源码。

二、基本用法

目前基本的用法格式为:

OkHttpUtils    .get()    .url(url)    .addParams("username", "hyman")    .addParams("password", "123")    .build()    .execute(callback);

通过链式去根据自己的需要添加各种参数,最后调用execute(callback)进行执行,传入callback则代表是异步。如果单纯的execute()则代表同步的方法调用。

可以看到,取消了之前一堆的get重载方法,参数也可以进行灵活的选择了。

下面简单看一下,全部的用法:

(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作为请求体传入到服务端,例如json字符串。

(4)Post File

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

将file作为请求体传入到服务端.

(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);        }    });

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

三、对于上传下载的回调

new Callback
(){ //... @Override public void inProgress(float progress) { //use progress: 0 ~ 1 }}

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

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

目前去除了Gson的依赖,提供了自定义Callback的方式,让用户自己去解析返回的数据,目前提供了StringCallbackFileCallback,BitmapCallback 分别用于返回string,文件下载,加载图片。

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

public abstract class UserCallback extends Callback
{ //非UI线程,支持任何耗时操作 @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
>{ @Override public List
parseNetworkResponse(Response response) throws IOException { String string = response.body().string(); List
user = new Gson().fromJson(string, List.class); return user; }}

五、对于https单向认证

非常简单,拿到xxx.cert的证书。

然后调用

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网站为权威机构颁发的证书,不需要以上设置。自签名的证书才需要。

六、配置

(1)全局配置

可以在Application中,通过:

OkHttpClient client = OkHttpUtils.getInstance().getOkHttpClient();

然后调用client的各种set方法。

例如:

client.setConnectTimeout(100000, TimeUnit.MILLISECONDS);

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

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

OkHttpUtils    .get()//    .url(url)//    .tag(this)//    .build()//    .connTimeOut(20000)    .readTimeOut(20000)    .writeTimeOut(20000)    .execute()

调用build()之后,可以随即设置各种timeOut.

(3)取消单个请求

RequestCall call = OkHttpUtils.get().url(url).build(); call.cancel();

(4)根据tag取消请求

目前对于支持的方法都添加了最后一个参数Object tag,取消则通过OkHttpUtils.cancelTag(tag)执行。

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

OkHttpUtils    .get()//    .url(url)//    .tag(this)//    .build()//@Overrideprotected void onDestroy(){    super.onDestroy();    //可以取消同一个tag的    OkHttpUtils.cancelTag(this);//取消以Activity.this作为tag的请求}

比如,当前Activity页面所有的请求以Activity对象作为tag,可以在onDestory里面统一取消。

七、浅谈封装

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

//创建okHttpClient对象OkHttpClient mOkHttpClient = new OkHttpClient();//创建一个Requestfinal Request request = new Request.Builder()                .url("https://github.com/hongyangAndroid")                .build();//new callCall 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 }

 

转载于:https://my.oschina.net/u/1399599/blog/799020

你可能感兴趣的文章
Windows内核再次出现0Day漏洞 影响win2000到win10所有版本 反病毒软件恐成瞎子
查看>>
H3C品牌刀片系统强势首发
查看>>
【CSS系列】图像映射
查看>>
First blood
查看>>
java 冒泡排序和快速排序 实现
查看>>
SQL存储过程中的几个常见设定SET QUOTED_IDENTIFIER/NOCOUNT/XACT_ABORT ON/OFF
查看>>
Silverlight与Flash区别之一
查看>>
删除恢复Hadoop集群中的DataNode
查看>>
Silverlight 2动态创建矩形对象(附完整源代码)
查看>>
从京东技术演进看互联网企业的成长历程
查看>>
MFC ado+mysql+odbc技术分享
查看>>
js中让字符串中特定字符红色显示
查看>>
HttpClient4.5教程-第二章-连接管理
查看>>
redhat Nginx 安装
查看>>
oracle 配置监听
查看>>
上海访微软 详解Azure和S+S
查看>>
跨国巨头猛攻语音识别技术 让电脑听懂人们说话
查看>>
moosefs即将发布新版
查看>>
FOSCommentBundle功能包:运行测试
查看>>
SmartGit 试用过期
查看>>