Android新手轻松学知乎日报开发(三)封装简单的OkHttp
16lz
2021-01-25
这个是我封装的最简单的版本。不适合使用到真实项目中,其实使用了一般也没问题,但是不建议,这个真实项目最好更灵活的重新封装一下
下面直接给使用方法吧,有些东西,如果初学者会用就行了。
过阵子会教你一步一步封装这个方法,保证看的懂能理解。
先看如何使用吧
String url = "http://www.baidu.com"; OkHttpUtils.getInstance().startPost(url, null,new OnNetResultListener() { @Override public void onSuccessListener(String successResult) { LogUtil.i("successResult : " + successResult); } @Override public void onFailureListener(String errorResult) { LogUtil.i("errorResult : " + errorResult); } });
上面的代码是调用一个请求的过程。这个是通过post请求的,需要一个url,我这里不需要参数直接用了null。参数用的是map类型存储的,new 一个map 传进去就行的。
最后是一个回调函数,数据返回了 会在回调函数里面出现,一般我们用json数据,这时候可以解析,然后使用了。整个网络请求还是非常简单的。
这里需要特别注意一点就是,运行这个需要网络权限,如何写在Glide那篇文章里面有 非常简单
<uses-permission android:name="android.permission.INTERNET"/>
下面是引用OkHttp的代码,这里封装了3.8.其实每个版本封装都差不多。先用这个就好。看懂这个新版本也会封装了
compile 'com.squareup.okhttp3:okhttp:3.8.0'
源码
package com.iscoding.demo.zhihu.http;import android.os.Handler;import java.io.IOException;import java.util.Iterator;import java.util.Map;import java.util.Set;import okhttp3.Call;import okhttp3.Callback;import okhttp3.FormBody;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.RequestBody;import okhttp3.Response;/** * 类功能:OkHttp的简单封装 ,方便使用 * 公司:IsCoding工作室 * 作者:IsCoding * 邮箱:[email protected] QQ:1400100300 */public class OkHttpUtils { public enum REQUEST_TYPE { POST, GET } private Handler handler; private OkHttpClient client; private static OkHttpUtils INSTANCE; private OkHttpUtils() { handler = new Handler(); client = new OkHttpClient.Builder() // 等线程池, 缓存, 文件下载讲完之后再来修改添加// .retryOnConnectionFailure()// .cache()// .readTimeout() .build(); } public static OkHttpUtils getInstance() { if (INSTANCE == null) { INSTANCE = new OkHttpUtils(); } return INSTANCE; } private void sendRequest(REQUEST_TYPE request_type, final String url, final Map header, final Map body, final OnNetResultListener listener) { // 构建一个Request Builder Request.Builder requestBuilder = new Request.Builder(); //设置请求的url requestBuilder.url(url); //设置请求头 setHeader(requestBuilder, header); if (request_type == REQUEST_TYPE.POST) { // 构建请求体 RequestBody requesBody = getRequestBody(body); if(requesBody == null){ // 构建一个Request Request request = requestBuilder.build(); //发送一个请求 并处理回调 createCall(request, listener); }else{ // 构建一个Request Request request = requestBuilder.post(requesBody).build(); //发送一个请求 并处理回调 createCall(request, listener); } } else if (request_type == REQUEST_TYPE.GET) { // 构建一个Request Request request = requestBuilder.get().build(); //发送一个请求 并处理回调 createCall(request, listener); } } private RequestBody getRequestBody(final Map body) { if(body==null || body.size()<=0){ return null; } FormBody.Builder buildder = new FormBody.Builder(); Set set = body.keySet(); Iterator iterator = set.iterator(); while (iterator.hasNext()) { String key = (String) iterator.next(); String value = body.get(key); buildder.add(key, value); } RequestBody requesBody = buildder.build(); return requesBody; } private void setHeader(Request.Builder requestBuilder, final Map header) { if(header==null || header.size()<=0){ return; } Set headSet = header.keySet(); Iterator headI = headSet.iterator(); while (headI.hasNext()) { String k = (String) headI.next(); String v = header.get(k); requestBuilder.addHeader(k, v); } } //请求并处理回调 private void createCall(Request request, final OnNetResultListener listener) { client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, final IOException e) { final String errMsg = e.getMessage(); // 发回主线程 handler.post(new Runnable() { @Override public void run() { listener.onFailureListener(errMsg); } }); } @Override public void onResponse(Call call, final Response response) throws IOException { final String str = response.body().string(); handler.post(new Runnable() { @Override public void run() { listener.onSuccessListener(str); } }); } }); } // *********************提供给外部的操作方法************************* // 封装: 对外提供使用方式, 具体的实现细节封装起来 public void startGet(String url, OnNetResultListener listener) {// _startGet(url, listener); sendRequest(REQUEST_TYPE.GET, url, null, null, listener); } public void startHeader(String url, Map headers, OnNetResultListener listener) { sendRequest(REQUEST_TYPE.GET, url, headers, null, listener); } public void startPost(String url, Map body, OnNetResultListener listener) { sendRequest(REQUEST_TYPE.POST, url, null, body, listener); } public void startPost(String url, Map body, Map headers, OnNetResultListener listener) { sendRequest(REQUEST_TYPE.POST, url, headers, body, listener); }}
下面是回调函数
package com.iscoding.demo.zhihu.http;/** * Created by ic on 2018/1/16. */public interface OnNetResultListener { public void onSuccessListener(String successResult); public void onFailureListener(String errorResult);}
更多相关文章
- Android(安卓)8.0 行为变更
- Android(安卓)4.0-Launcher-FolderEdit-onKeyPreIme
- [置顶] Intent filter 关于Action、Category属性详解---附带实例
- Android(安卓)Kotlin 开发踩坑之旅
- Android(安卓)翻页效果 电子书
- Android之全面解析OkHttp源码
- Android(安卓)5.0之后隐式声明Intent 启动Service引发的问题
- Android应用程序从源码到安装包的整个过程
- 第3.3.4节 创建高级图形之RenderScript(二)