.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
{
//非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的请求
}
比如,当前Activity页面所有的请求以Activity对象作为tag,可以在onDestory里面统一取消。
七、浅谈封装
其实整个封装的过程比较简单,这里简单描述下,对于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<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进行包装,所以这个方法类似于一个钩子。
其实这个过程有点类似模板方法模式,有兴趣可以看看一个短篇介绍设计模式 模版方法模式 展现程序员的一天 .
对于更加详细的用法,可以查看github上面的readme,以及demo,目前demo包含:
对于上传文件的两个按钮,需要自己搭建服务器,其他的按钮可以直接测试。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://i-blog.csdnimg.cn/blog_migrate/131dba65dd0b6f757bd6c9071a8a7783.jpeg)
写在最后
对程序员来说,很多技术的学习都是“防御性”的。也就是说,我们是在为未来学习。我们学习新技术的目的,或是为了在新项目中应用,或仅仅是为了将来的面试。但不管怎样,一定不能“止步不前”,不能荒废掉。
![
文章以下内容会给出阿里与美团的面试题(答案+解析)、面试题库、Java核心知识点梳理等
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
些内容对你有帮助,可以扫码获取!!(备注:Android)**
![](https://i-blog.csdnimg.cn/blog_migrate/131dba65dd0b6f757bd6c9071a8a7783.jpeg)
写在最后
对程序员来说,很多技术的学习都是“防御性”的。也就是说,我们是在为未来学习。我们学习新技术的目的,或是为了在新项目中应用,或仅仅是为了将来的面试。但不管怎样,一定不能“止步不前”,不能荒废掉。
[外链图片转存中…(img-6UqQh8vg-1712150508847)]
[外链图片转存中…(img-quxUfxL9-1712150508847)]
[外链图片转存中…(img-EVUUKpBe-1712150508847)]
[外链图片转存中…(img-QggIDCFj-1712150508848)]
文章以下内容会给出阿里与美团的面试题(答案+解析)、面试题库、Java核心知识点梳理等