Android打造一个通用的网络请求引擎HttpUtils
来源:互联网 发布:数据库系统概论公开课 编辑:程序博客网 时间:2024/06/07 15:15
打造一个通用的网络请求引擎HttpUtils
- 为什么要打造这个引擎
- Xutils的引擎
- Okhttp的引擎
- 使用
为什么要打造这个引擎
自Android 6.0之后,HttpClient被废,好多APP是不是出现蛋疼的事,赶紧换掉网络请求框架。兼容6.0版本。但是想换网络请求不是一件容易的事。你会发现有多好地方调用了此网络请求。想彻底换掉得折腾一番。再者,好多时候。因为网上的网络框架很多。xutils、Okhttp、Retrofit等等。在迭代过程中,发现想换个网络框架使用。是一个很蛋疼的事。所以我们为了解决这一痛点,打造一个通用的引擎。
从网络请求谈起
网络请求一般也就是下面几步
1、选择请求方式
2、穿入请求地址以及请求参数
3、网络请求成功与否的回调
第一步:我们写这样一个引擎接口IHttpEngine
public interface IHttpEngine { /** * post请求 * @param url * @param params * @param httpCallBack */ void post(String url , Map<String,String> params , HttpCallBack httpCallBack); /** * get请求 * @param url * @param params * @param httpCallBack */ void get(String url , Map<String,String> params , HttpCallBack httpCallBack);}
第二步:我们写自己的一个请求成功与否的回调
这里我们既想要拿到网络请求返回的json串,又想拿到解析后的对象。这个自己考虑,至少我觉得这样似乎更合理一些
public abstract class HttpCallBack<T> { /** * * @param resultjson 请求成功返回的json串 * @param result 解析好的对象 * * 直接解析好的可操作对象 返回对象不明确,所以这个地方我们需要使用泛型 */ public abstract void onSuccess(String resultjson , T result); public abstract void onFail(Throwable ex);}
第三步:打造我们自己想要的引擎(Xutils)
xutils的具体使用步骤:https://github.com/wyouflf/xUtils3 这里就不做介绍了
实现我们引擎接口
public class XUtilsHttpEngine implements IHttpEngine{ @Override public void post(String url, Map<String, String> params, final HttpCallBack httpCallBack) { // 封装url参数 RequestParams requestParams = new RequestParams(url); Iterator<Map.Entry<String, String>> iterator = params.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<String,String> entry = (Map.Entry) iterator.next(); requestParams.addParameter(entry.getKey(),entry.getValue()); } x.http().post(requestParams, new Callback.CommonCallback<String>() { @Override public void onSuccess(String result) {// 主线程 // 获取泛型的类型 Type genType = httpCallBack.getClass().getGenericSuperclass(); Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); Class typeClass = (Class) params[0]; httpCallBack.onSuccess(result,GsonUtils.jsonToObject(result,typeClass)); } @Override public void onError(Throwable ex, boolean isOnCallback) { httpCallBack.onFail(ex); } @Override public void onCancelled(CancelledException cex) { } @Override public void onFinished() { } }); } @Override public void get(String url, Map<String, String> params, HttpCallBack httpCallBack) { }}
第四步:引擎已打造完毕,我们现在想要使用该怎么办?
1、可能有些同学会说,直接new XUtilsHttpEngine 对象,调里面的方法不就可以了嘛。确实这样是可以使用的。但是你会发现我们想要修改成其他网络框架还是那么困难。根本就没有达到我们期望的效果。
2、所以这里我们创建一个HttpUtils的类,通过new 这个类,来调里面的方法。之后我们想要切换使用OKhttp。只需要在这个类中的构造方法中。创建OKhttp的引擎即可httpEngine = new OkHttpEngine();。
public class HttpUtils { private IHttpEngine httpEngine; public static Handler handler = new Handler(); public HttpUtils() { //这里用来切换引擎// httpEngine = new XUtilsHttpEngine(); httpEngine = new OkHttpEngine(); } /** * post请求 * @param url * @param params * @param httpCallBack */ public void post(String url , Map<String,String> params , HttpCallBack httpCallBack){ httpEngine.post(url , params ,httpCallBack); } /** * get请求 * @param url * @param params * @param httpCallBack */ public void get(String url , Map<String,String> params , HttpCallBack httpCallBack){ httpEngine.get(url , params ,httpCallBack); }}
使用
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void login(View view){ doLogin(); } private void doLogin() { HttpUtils httpUtils = new HttpUtils(); Map<String , String> params = new HashMap<>(); String url = "http://huyong.viewcreator3d.cn/index.php/Api/Ayhyy/admin_login"; params.put("admin_name","18601135484"); params.put("admin_password","888888"); params.put("sign","ayhyyayhyyayhyy"); httpUtils.post(url, params, new HttpCallBack<UserInfo>() { @Override public void onSuccess(String resultjson, UserInfo userinfo) { Toast.makeText(MainActivity.this,resultjson+"用户名"+userinfo.info.user_info.admin_name,Toast .LENGTH_SHORT) .show(); } @Override public void onFail(Throwable ex) { Toast.makeText(MainActivity.this,"请求失败",Toast.LENGTH_SHORT).show(); } }); }}
把okHttp的引擎贴出来。想要使用只需要在HttpUtils这个类中的构造方法修改即可
public class OkHttpEngine implements IHttpEngine{ @Override public void post(String url, Map<String, String> params, final HttpCallBack httpCallBack) { FormBody.Builder body = new FormBody.Builder(); Iterator<Map.Entry<String, String>> iterator = params.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<String,String> entry = (Map.Entry) iterator.next(); body.add(entry.getKey(),entry.getValue()); } OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url(url) .post(body.build()) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { httpCallBack.onFail(e); } @Override public void onResponse(Call call, final Response response) throws IOException { // 获取泛型的类型 Type genType = httpCallBack.getClass().getGenericSuperclass(); Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); final Class typeClass = (Class) params[0]; final String result = response.body().string(); HttpUtils.handler.post(new Runnable() { @Override public void run() { // 把它弄到主线程中 httpCallBack.onSuccess(result,GsonUtils.jsonToObject(result,typeClass)); } }); } }); } @Override public void get(String url, Map<String, String> params, HttpCallBack httpCallBack) { }}
总结
这里我可能只是贴出了POST请求,而get请求以及下载、上传等等都没有去贴出来。你是我想说的是学编程学习的是别人的思想,如果思想领悟,加上动手才会收货更多。
附源码
源码地址
阅读全文
0 0
- Android打造一个通用的网络请求引擎HttpUtils
- Android的HttpUtils的网络请求OkHttp
- Xutils的网络请求httputils
- Android HttpUtils网络请求工具类的实现
- android 请求工具FinalHttp和HttpUtils的一个区别
- Ion + HttpUtils 网络请求
- httpUtils网络请求
- HttpUtils网络请求
- Android HttpUtils-Http请求的工具类
- HttpURLConnection、HttpClient请求网络数据、Xutils的HttpUtils 请求数据
- HttpUtils 的post请求
- [Android]打造一个Android通用的JSON数据解析框架
- HttpUtils 用于进行网络请求的工具类(未测试)
- HttpUtils 用于进行网络请求的工具类
- 打造一个通用的TitleView
- 关于android Httputils请求问题
- Android网络连接---xUtils(HttpUtils)
- Android 网络请求通用的get与post方式
- appium grid模式运行自动化
- Android JNI(三)————JNI_在java中调用C函数(显示映射)
- Angular2中constructor与ngOninit的区别
- zabbix中文配置指南
- (198)材质编辑器
- Android打造一个通用的网络请求引擎HttpUtils
- Android安全之NDK的代码混淆 -- Ollvm
- TS3310带库更换驱动器步骤
- 王伟奇个人比赛记录----无人机
- service基础
- USACO-Section 1.3 Mixing Milk[...]
- 找到一本不错的Linux电子书,附《Linux就该这么学》章节目录
- Json 转换 序列化与反序列化总结
- 学生管理系统