文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android中OkHttpUtils如何使用

2023-05-30 22:52

关注

Android中OkHttpUtils如何使用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

引入:

Android Studio

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

compile project(':okhttputils')

或者

compile 'com.zhy:okhttputils:2.0.0'

二、基本用法

目前基本的用法格式为:

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的方式,让用户自己去解析返回的数据,目前提供了StringCallback,FileCallback,BitmapCallback 分别用于返回string,文件下载,加载图片。

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

public abstract class UserCallback extends Callback<User>{ //非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<User>>{ @Override public List<User> parseNetworkResponse(Response response) throws IOException {  String string = response.body().string();  List<User> user = new Gson().fromJson(string, List.class);  return user; }}

五、对于https单向认证

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

然后调用

OkHttpUtils.getInstance()  .setCertificates(inputstream);

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

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<String, String> params; protected Map<String, String> headers; protected OkHttpRequest(String url, String tag,       Map<String, String> params, Map<String, String> 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进行包装,所以这个方法类似于一个钩子。

其实这个过程有点类似模板方法模式。

看完上述内容,你们掌握Android中OkHttpUtils如何使用的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网行业资讯频道,感谢各位的阅读!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯