一直使用OkHttp 经常烦人的地方是回调方法  数据解析后必须通过handler 在主线程做操作 网上找了很多资料 发现有些都是基于Gson做的解析

fastJson 在封装时 泛型传入会有很多不方便。想了很久参考着写了如下代码 测试OK!例子是用post方式传递数据

首先  封装写了okhttp的统一使用调取接口方法 这个放在了Application里面

url是接口地址  object是请求的参数对象  params是和后台定义好的参数传递方式 。 最后就是最主要的回调方法了!

public <T> void doPostAsyncfilexx(String url, T object, OkhttpCallbackUtils callback) {

        Log.d("CD", "url=="+url+"==params=="+JSON.toJSONString(object));
RequestBody requestBody = new FormBody.Builder()
.add("params", JSON.toJSONString(object))
// .add("phone", "13808892360")
// .add("password", "123")
.build(); Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build(); mOkHttpClient.newCall(request).enqueue(callback); } 回调类OkhttpCallbackUtils

package com.example.admin.hhh_zhjg.utils;

import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.example.admin.hhh_zhjg.responsebean.BaseBeanRsp; import java.io.IOException;
import java.lang.ref.WeakReference; import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response; public class OkhttpCallbackUtils<T> implements Callback { private TypeReference<BaseBeanRsp<T>> mClazz; protected OkhttpCallbackUtils(TypeReference<BaseBeanRsp<T>> mClazz) {
if (mClazz == null) {
throw new IllegalArgumentException("response can't be null");
} this.mClazz = mClazz;
} @Override
public void onFailure(Call call, IOException e) { Message message = Message.obtain();
message.what = ConValue.MSG_FAIL;
message.obj = e;
mHandler.sendMessage(message);
} @Override
public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) {
String body = response.body().string(); //fastjison fastjson 解析多级泛型时而失败 解析 对泛型最多只能解析一层泛型数据 泛型多层嵌套无法解析内部泛型
//分析后要传人整个TypeReference<T> BaseBeanRsp<T> mResponse = JSON.parseObject(body, mClazz);
//mResponse = JSON.parseObject(body,type);
Log.d("CD","DDDDJSOM="+JSON.toJSONString(mResponse)); Message message = Message.obtain();
message.what = ConValue.MSG_SUCESS;
message.obj = mResponse;
mHandler.sendMessage(message); } else {
Message message = Message.obtain();
message.what = ConValue.MSG_FAIL;
mHandler.sendMessage(message);
} } //hander 的处理
private Handler mHandler = new UIHandler(this); private static class UIHandler<T> extends Handler { //handler 弱引用
private WeakReference mWeakReference; private UIHandler(OkhttpCallbackUtils callback) {
super(Looper.getMainLooper()); mWeakReference = new WeakReference(callback);
} @Override
public void handleMessage(Message msg) {
super.handleMessage(msg); switch (msg.what) {
case ConValue.MSG_SUCESS: {
BaseBeanRsp<T> t = (BaseBeanRsp<T>) msg.obj;
OkhttpCallbackUtils callback = (OkhttpCallbackUtils) mWeakReference.get();
if (callback != null) {
callback.onResponse(t);
}
break;
}
case ConValue.MSG_FAIL: {
IOException e = (IOException) msg.obj;
OkhttpCallbackUtils callback = (OkhttpCallbackUtils) mWeakReference.get();
if (callback != null) {
callback.onFailure(e);
}
break;
}
default:
super.handleMessage(msg);
break;
} } } //增加两个外面调用处理的方法
public void onResponse(BaseBeanRsp<T> t) { } public void onFailure(IOException e) { } } OK 这样的方式 在数据类型是多个泛型时就不会有问题了, 接下来就是在获取数据时的调用了
private void getData() {

    GetMeasureListReq req = new GetMeasureListReq();
req.sectionCode=sectionCode;
req.pageno=pageIndex+"";
req.pagesize=pagesize+""; 上面这个是我写的请求数据类 可以不用管,下面才是调用方法
ConValue.URL+ConValue.MEASURELIST 是接口url

注意回调方法
BaseBeanRsp<GetMeasureListRsp>是接收到的数据类型 在做的项目返回数据有点繁杂所以写了两个嵌套的数据结构
BaseBeanRsp<> 是大的数据结构 框架一般是不变的,
GetMeasureListRsp是嵌套的数据结构 返回数据类型根据你自己的数据定义
    App.getInstance().doPostAsyncfilexx(ConValue.URL+ConValue.MEASURELIST,req,new OkhttpCallbackUtils<GetMeasureListRsp>(new TypeReference<BaseBeanRsp<GetMeasureListRsp>>(){}){

        @Override
public void onResponse(BaseBeanRsp<GetMeasureListRsp> t) {
super.onResponse(t); Toast.makeText(getActivity(), "获取数据OK !", Toast.LENGTH_SHORT).show();
主UI处理代码写这里
} @Override
public void onFailure(IOException e) {
super.onFailure(e);
Toast.makeText(getActivity(), "获取数据失败!", Toast.LENGTH_SHORT).show(); }
}); }
只要这三步 后面接口拿数据 和主线程UI处理是不是方便 清楚很多,就不用每次都写一遍okhttp的调用和handler方法了。

最后在说下 handler用的弱引用, 在之前写的方法是在nDestroy() 中用mHandler.removeCallbacksAndMessages(null); 本人觉得这个可能比弱引用处理的好些。只是封装的写法只会弱引用 不知道还有其他好的方法没 。。

okhttp +fastJson 在UI层的回调封装的更多相关文章

  1. 业务接口+UI层的设计(基于Castle实现的Repository)

    业务接口+UI层的设计(基于Castle实现的Repository) Repository层设计的文章见:[http://www.cnblogs.com/yomho/p/3297042.html]   ...

  2. 【Yom框架】漫谈个人框架的设计之三:业务接口+UI层的设计(基于Castle实现的Repository)

    Repository层设计的文章见:[http://www.cnblogs.com/yomho/p/3297042.html]   一.概要设计 上面Reposity 应该为 Repository 特 ...

  3. 【DDD】领域驱动设计实践 —— UI层实现

    前面几篇blog主要介绍了DDD落地架构及业务建模战术,后续几篇blog会在此基础上,讲解具体的架构实现,通过完整代码demo的形式,更好地将DDD的落地方案呈现出来.本文是架构实现讲解的第一篇,主要 ...

  4. UI层实现

    领域驱动设计实践 —— UI层实现   目录 1. User Interface 2. Controller 3.  DTO 4.  infrastructure层的公共组件 5. UI层类图 6. ...

  5. 【类库】私房干货.Net数据层方法的封装

    [类库]私房干货.Net数据层方法的封装 作者:白宁超 时间:2016年3月5日22:51:47 摘要:继上篇<Oracle手边常用70则脚本知识汇总>文章的发表,引起很多朋友关注.便促使 ...

  6. mvc项目架构搭建之UI层的搭建

    项目架构搭建之UI层的搭建 Contents 系列一[架构概览] 0.项目简介 1.项目解决方案分层方案 2.所用到的技术 3.项目引用关系 系列二[架构搭建初步] 4.项目架构各部分解析 5.项目创 ...

  7. Spring.NET在MVC中实现业务层和UI层解耦

    最近在项目中用到了Spring.NET,使用它来实现业务层和UI层解耦.使用过程中难免遇到问题,现把遇到的一些问题整理出来,留作笔记. 使用的开发工具是vs2017,.netframework 4.6 ...

  8. 如何实现UI层的松耦合

    UI层的松耦合主要是指html.css.js的松耦合 1.  将js代码从css中分离,即不使用expression 2.  将css从js中分离,尽量不要在js中直接操作css.如果需要操作,可以使 ...

  9. UI层自动化测试介绍

    UI指的是用户可以用肉眼可以看到的页面. UI层自动化测试的原理.不论是web端还是移动端,原理都是一样的,就是基于页面元素的识别和定位来进行模拟用户行为. 首先识别到某个元素,比如一个按钮,然后定义 ...

随机推荐

  1. Docker - 用Flannel跨主机

    试了下比较流行的几种SDN,感觉flannel还是比较好用,这里简单记录一下. 用的是virtualbox,3个机器,分别为: genesis : inet 192.168.99.103/24 brd ...

  2. HDU1716(全排列)

    排列2 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  3. [转载]【虚拟化系列】VMware vSphere 5.1 简介与安装

    转载自:http://mabofeng.blog.51cto.com/2661587/1017680 一. VMware vSphere 5.1简介           vSphere是VMware推 ...

  4. 细说Asp.Net Web API消息处理管道(二)

    在细说Asp.Net Web API消息处理管道这篇文章中,通过翻看源码和实例验证的方式,我们知道了Asp.Net Web API消息处理管道的组成类型以及Asp.Net Web API是如何创建消息 ...

  5. Mybatis实战之TypeHandler高级进阶

    上篇文章分享了在项目实战中自定义Mybatis的TypeHandler来处理枚举类型.文章结尾也指出了美中不足之处,那就是每次都需要指定我们自定义的枚举TypeHandler. 随着项目枚举类型的增多 ...

  6. 运行gpg --gen-key生成key时出现卡住的问题

    背景 在搭建Ubuntu16.04的本地apt源时,需要运行"gpg --gen-key"命令,但是在执行该命令时,出现了:"Not enough random byte ...

  7. CSS里padding和margin的区别是什么?

    通俗地说——padding 就是内容与边框的距离:margin 就是边框与其他元素的距离.

  8. 《C++ Primer》读书笔记—第一章 开始

    声明: 文中内容收集整理自<C++ Primer 中文版 (第5版)>,版权归原书所有. 学习一门程序设计语言最好的方法就是练习编程. 1.一个函数的定义包含四个部分:返回类型(retur ...

  9. BZOJ 1033: [ZJOI2008]杀蚂蚁antbuster(模拟)

    坑爹的模拟题QAQ DEBUG多了1kb QAQ 按题意做就行了 注意理解题意啊啊啊啊 尼玛输出忘换行wa了3次QAQ CODE: #include<cstdio>#include< ...

  10. esri-leaflet入门教程(5)- 动态要素加载

    esri-leaflet入门教程(5)- 动态要素加载 by 李远祥 在上一章节中已经说明了esr-leaflet是如何加载ArcGIS Server提供的各种服务,这些都是服务本身来决定的,API脚 ...