Android 一个改善的okHttp封装库

  • Android 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<List>

{

@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()//

@Override

protected void onDestroy()

{

super.onDestroy();

//可以取消同一个tag的

OkHttpUtils.cancelTag(this);//取消以Activity.this作为tag的请求

}

相关推荐
张风捷特烈6 小时前
Flutter 伪3D绘制#03 | 轴测投影原理分析
android·flutter·canvas
omegayy9 小时前
Unity 2022.3.x部分Android设备播放视频黑屏问题
android·unity·视频播放·黑屏
mingqian_chu9 小时前
ubuntu中使用安卓模拟器
android·linux·ubuntu
自动花钱机9 小时前
Kotlin问题汇总
android·开发语言·kotlin
行墨12 小时前
Kotlin 主构造函数
android
前行的小黑炭12 小时前
Android从传统的XML转到Compose的变化:mutableStateOf、MutableStateFlow;有的使用by有的使用by remember
android·kotlin
_一条咸鱼_12 小时前
Android Compose 框架尺寸与密度深入剖析(五十五)
android
在狂风暴雨中奔跑12 小时前
使用AI开发Android界面
android·人工智能
行墨12 小时前
Kotlin 定义类与field关键
android
信徒_13 小时前
Mysql 在什么样的情况下会产生死锁?
android·数据库·mysql