OKhttp 的二次封装

网络第三方框架有xutil、xutil3、volle以及okhttp 和okhttp衍生出来的一大批壳外的壳
那么既然已经有了那么多优秀的产品为什么还要自己封装呢,有以下两个原因:

1.引入retrofit、 noHttp 等增加了很多不必要的代码,增大了apk 包(第三方引用的会被keep)
2.使用retrofit、 noHttp等会对程序的可扩展性产生重大隐患
3.适合自己项目的才是好方案,合理的中间层处理会大大降低程序的代码量和开销

下面将从代码角度分析如何封装适合自己的网络框架
本文仅适合具备较强学习能力的开发者阅读,因为此文的目的在于提供思路和简单的使用场景,为达到适合自己的网络框架需求需要自己对中间层根据范例进行处理,对合适的modle进行编写。
在此之前你需要具备以下基础技能点:
接口回调、泛型、线程

一、使用场景

获取Person 对象,onSucess、onFaild回调在主线程

public void  getPerson(){
       HashMap<String ,String>params=new HashMap<String,String>();
       params.put("type","1");
       HttpRequest.postRequest(context, "http://test/person", params, 
               new ModleRequest<Person>(Person.class) {
           @Override
           protected void onSucess(Person person) {}
           @Override
           protected void onFaild(Exception e) { }
       });
   }

二、入口程序

import java.io.File;
import java.util.HashMap;
import java.util.concurrent.TimeUnit;

import cnn.customer.utils.net.action.DownLoad;
import cnn.customer.utils.net.action.GetRequest;
import cnn.customer.utils.net.action.PostRequest;
import cnn.customer.utils.net.action.UploadRequest;
import cnn.customer.utils.net.inter.BaseRequest;
import cnn.customer.utils.net.inter.FileRequest;
import cnn.customer.utils.net.modle.StringRequest;
import okhttp3.OkHttpClient;

/**
* Created by biyunlong on 2016/9/5.
*/
public class HttpRequest {
   public static OkHttpClient okHttpClient;

   public static void init() {
       if (null == okHttpClient) {
           OkHttpClient.Builder ClientBuilder = new OkHttpClient.Builder();
           ClientBuilder.readTimeout(60, TimeUnit.SECONDS);//读取超时
           ClientBuilder.connectTimeout(60, TimeUnit.SECONDS);//连接超时
           ClientBuilder.writeTimeout(60, TimeUnit.SECONDS);//写入超时
           okHttpClient = ClientBuilder.build();
       }
   }

   public static void getRequest(String url, final BaseRequest re) {
       GetRequest.getRequest(url,re,okHttpClient);
   }

   //普通接口
   public static void  postRequest(HashMap<String, String> params, String url, final BaseRequest re) {
       PostRequest.postRequest(params,url,re,okHttpClient);
   }

   //下载文件
   public static void downLoad(String url, String path, String name, FileRequest fileRequest){
       DownLoad.downLoadFile(url,path,name,okHttpClient,fileRequest);
   }

   //上传单个图片
   public void uploadImage(String url, HashMap<String, String> params, File file, StringRequest stringRequest){
       UploadRequest.upLoadFile(url,params,file,stringRequest,okHttpClient);
   }

   //上传多张图片
   public void uploadMoreImage(String url, HashMap<String, String> params, HashMap<String, String> params2, File file, StringRequest stringRequest){
       UploadRequest.uploadMoreFile(url,params,params2,stringRequest,okHttpClient);
   }

   //上传base64图片
   public void UploadBase64( String url, HashMap<String, String> params, String content, final BaseRequest re){
       UploadRequest.UploadBase64(url,params,content,re,okHttpClient);
   }
}

三、执行程序

import android.util.Log;

import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import cnn.customer.utils.net.inter.BaseRequest;
import cnn.customer.utils.net.tools.MainHandler;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

/**
* 文件描述:
* 创 建 人:byl
* 创建时间:2017/9/5 0005 18:13
*/
public class PostRequest {
   public static void postRequest(HashMap<String, String> params, String url, final BaseRequest re, OkHttpClient okHttpClient) {
       //创建Form表单对象,可以add多个键值队
       FormBody.Builder builder = new FormBody.Builder();
       if (params != null) {
           Iterator<Map.Entry<String, String>> it = params.entrySet().iterator();
           while (it.hasNext()) {
               Map.Entry<String, String> entry = it.next();
               builder.add(entry.getKey(), entry.getValue() + "");
           }
       }
       FormBody formBody = builder.build();
       //创建一个Request
       Request request = new Request.Builder()
               .url(url)
               .post(formBody)
               .build();
       //发送请求获取响应
       Call call = okHttpClient.newCall(request);
       call.enqueue(new Callback() {
           @Override
           public void onFailure(Call call, final IOException e) {
               re.baseOnFaild(e);
           }

           @Override
           public void onResponse(Call call, Response response) throws IOException {
               final String str = response.body().string();

               MainHandler.getInstance().post(new Runnable() {
                   @Override
                   public void run() {
                       re.baseOnSucess(str);
                   }
               });
               Log.d("debug", str);

           }
       });
   }
}

四、modle中间层

     可根据需要自行编写StringRequest 或者ListRequest ,也可以根据泛型指定返回格式,然后通过类型转换(不推荐)

/**
* Created by biyunlong on 2016/9/5.
*/
public abstract class BaseRequest {

   public abstract void baseOnSucess(String json);

   public abstract void baseOnFaild(Exception e);

}





import com.google.gson.Gson;

import org.json.JSONException;
import org.json.JSONObject;

import java.lang.reflect.ParameterizedType;

import cnn.customer.utils.net.inter.BaseRequest;

/**
* Created by biyunlong on 2017/5/3.
* Make progress every day
*/

public abstract class BeanRequest<T> extends BaseRequest {
   private int status;
   private String msg;

   @Override
   public void baseOnSucess(String jsonstr) {

       try {
           JSONObject jsonRoot = new JSONObject(jsonstr);
           status=jsonRoot.getInt("result");
           msg=jsonRoot.getString("message");
           if(status==200){
               JSONObject jsonResult=jsonRoot.getJSONObject("data");
               String strResult=jsonResult.toString();
               T t=(T)(new Gson().fromJson(strResult,((ParameterizedType)(getClass().getGenericSuperclass())).getActualTypeArguments()[0]));
               onSucess(t,status,msg);
           }else{
               onSucess(null,status,msg);
           }

       } catch (JSONException e) {
           e.printStackTrace();
       }


   }

   @Override
   public void baseOnFaild(Exception e) {
       onFaild(e);
   }

   public abstract void onSucess(T t,int status,String msg);
   public abstract void onFaild(Exception e);
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容