声明:本文纯粹是记录自己使用的过程,并没有深入的理解以及透彻的分析,本文使用的是鸿洋大神封装的okhttputils ,主要用到了post,get以及File文件下载。
鸿洋大神blog:https://blog.csdn.net/lmj623565791/article/details/47911083
具体使用:
1.初始化okhttpUils以及参数配置
//cook配置(含session)
CookieJarImpl cookieJar = new CookieJarImpl(new PersistentCookieStore(getApplicationContext()));
//http
HttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory(null, null, null);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(new LoggerInterceptor("TAG"))
.connectTimeout(30000, TimeUnit.MILLISECONDS)
.readTimeout(30000, TimeUnit.MILLISECONDS)
.cookieJar(cookieJar)
.sslSocketFactory(sslParams.sSLSocketFactory, sslParams.trustManager)
//其他配置
.build();
OkHttpUtils.initClient(okHttpClient);
通常放在application中。
2.post的具体使用
@Override
public void sendMsg(final String json, String flag ,final SendMsgListener sendMsgListener) {
String url = Constant.baseUrl + "AppWebService.do?appGetSms";
OkHttpUtils
.post()
.url(url)
.addParams("json",json)
.addParams("flag",flag)
.build()
.execute(new ResponseCallback() {
@Override
public void onError(Call call, Exception e, int id) {
LOG.d("url---------->", e.getMessage());
sendMsgListener.sendMsgFail(MyApplication.getInstance().getApplicationContext().getString(R.string.http_request_fail_hint),json);
}
@Override
public void onResponse(ResponseEntity response, int id) {
if(response.isSuccess()){
sendMsgListener.sendMsgSuccess(json);
}else{
sendMsgListener.sendMsgFail(response.getMsg(),json);
}
}
});
}
ResponseCallback.java
public abstract class ResponseCallback extends Callback<ResponseEntity>
{
@Override
public ResponseEntity parseNetworkResponse(Response response, int id) throws IOException
{
String string = response.body().string();
LOG.d("string" , string);
return new Gson().fromJson(string, ResponseEntity.class);
}
}
ResponseEntity.java
public class ResponseEntity {
/**
* msg : 成功
* success : true
*/
private String msg;
private boolean success;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
}
说明:ResponseEntity .java只是一个实体类,具体的回传数据根据接口文档来,ResponseCallback这个类是一个自定义的CallBack,主要实现了接口请求成功的回调方法以及请求失败的回调方法,并且通过gson解析直接将返回的json串直接解析成实体类,另外sendMsg()方法中,OkHttpUtils的使用遵循的是链式结构的模式,参数的添加主要是以键值对的形式拼接,这个callback()的回调方法以及请求都是执行在子线程当中的,如有疑问可以自行查阅源码。
2.get的具体使用,与post如出一辙,不在过多解释,直接上代码
@Override
public void sendMsg(final String json, String flag ,final SendMsgListener sendMsgListener) {
String url = Constant.baseUrl + "AppWebService.do?appGetSms";
OkHttpUtils
.get()
.url(url)
.addParams("json",json)
.addParams("flag",flag)
.build()
.execute(new ResponseCallback() {
@Override
public void onError(Call call, Exception e, int id) {
LOG.d("url---------->", e.getMessage());
sendMsgListener.sendMsgFail(MyApplication.getInstance().getApplicationContext().getString(R.string.http_request_fail_hint),json);
}
@Override
public void onResponse(ResponseEntity response, int id) {
if(response.isSuccess()){
sendMsgListener.sendMsgSuccess(json);
}else{
sendMsgListener.sendMsgFail(response.getMsg(),json);
}
}
});
}
看到代码的小伙伴肯定惊呆了,肯定会说这个和post的代码简直一模一样啊,没错,细心的小伙伴肯定会看到唯一不同的地方就是.post()改成了.get(),其他完全相同,所以此处就不必赘述具体使用了。
3.File下载,该处可以运用到软件更新的地方
private static void downloadFile(final Context context,final String serverVersionName)
{
String downLoadUrl = Constant.baseUrl + "AppWebService.do?downloadLocal";
//
OkHttpUtils
.get()
.url(downLoadUrl)
.build()
.execute(new FileCallBack(Environment.getExternalStorageDirectory().getAbsolutePath(), context.getString(R.string.app_name) + serverVersionName + ".apk")//
{
@Override
public void onBefore(Request request, int id)
{
}
@Override
public void inProgress(float progress, long total, int id)
{
LOG.e("AlterPasswordModelImpl","inProgress :" + (int) (100 * progress));
DownloadDialog.setProgress((int) (100 * progress));
}
@Override
public void onError(Call call, Exception e, int id)
{
LOG.e("AlterPasswordModelImpl", "onError :" + e.getMessage());
DownloadDialog.closeDialog(mDownloadDialog);
ShowToast.showToast("下载失败,请检查网络连接",context);
}
@Override
public void onResponse(File file, int id)
{
LOG.e("localFile", "onResponse :" + file.getAbsolutePath());
saveFilePath(context,file.getAbsolutePath());
DownloadDialog.closeDialog(mDownloadDialog);
install(context,file);
}
});
}
说明一下:其实上述的请求方式还是一个get请求,只不过请求的callback是一个FileCallBack罢了,这个callBack需要实现几个特殊的方法,inProgress(),这个方法的意思就是下载中的方法,主要用于显示下载的进度条等操作,onError(),下载失败的方法,onResponse()下载成功的方法,在这可以根据需求处理一定的逻辑。
如果想看软件升级的相关内容,我的另一篇文章有讲到:https://blog.csdn.net/Silence_Sep/article/details/80451342
另外okhttputils的使用在下面的源码中有用到:https://download.csdn.net/download/silence_sep/10562709
最后这篇文章也对okhttpsutils其他用法做了简单的介绍:
https://www.jianshu.com/p/721381cf974f