安卓okhttp的封装

现在我们项目中对okhttp的封装,跟大家分享一下.我们项目请求的时候是上传的json.后台解析.所有前段就很省事了.直接上代码
            
public classHttpOk {
   /**
     * 连接超时(默认:30秒)
     */
   public static intTimeOut=30;


   private staticOkHttpClient getHttpClient() {
        OkHttpClient client =newOkHttpClient();
        client.setConnectTimeout(TimeOut, TimeUnit.SECONDS);
       returnclient;
    }

   /**
     * 提交json 不检测更新
     *
     *@param url                   请求路径
    *@param requestBean     请求的json
     *@param cb                         回调
     *@param resultClass          返回的实体类型
     *@param tag                    用于区分网络请求
    */

   public static voidpostData(String url, Object requestBean, ACallOkHttp cb, Class<?> resultClass,inttag) {
       if(url.isEmpty()) {
           return;
        }
        Gson gson =newGson();

        String json = gson.toJson(requestBean);
        // LogUtils.i("请求的json="+ json);

        RequestBody formBody =newFormEncodingBuilder()
                .add("data", json)
                .build();

        Request request =newRequest.Builder()
                .url(url)
                .post(formBody)
                .build();
     //给回调返回的实体类
        cb.registerClass(resultClass, tag);
     //开始请求
        cb.onBeforeRequest(tag);
       getHttpClient().newCall(request).enqueue(cb);
    }

   /**
     * 提交json和图片,文本集合
     *
     *@param
    *@param cb
    */
   public static voidpost(String url, Object requestBean, Map<String, String> images, ACallOkHttp cb, Class<?> resultClass,inttag) {

        MultipartBuilder builder =newMultipartBuilder().type(MultipartBuilder.FORM);

       if(images !=null) {
           for(Map.Entry<String, String> entry : images.entrySet()) {
                builder.addFormDataPart(entry.getKey(), entry.getKey(),
                        RequestBody.create(MediaType.parse(guessMimeType(entry.getValue())),newFile(entry.getValue())));
            }
        }

        Gson gson =newGson();
        String json = gson.toJson(requestBean);
      //   LogUtils.d("请求的json", json);
        builder.addFormDataPart("data", json);

       //构建请求体
       RequestBody requestBody = builder.build();

       //构建请求
       Request request =newRequest.Builder()
                .url(url)//地址
               .post(requestBody)//添加请求体
               .build();

        cb.registerClass(resultClass, tag);
        cb.onBeforeRequest(tag);
       getHttpClient().newCall(request).enqueue(cb);
    }

   /**
     * 获取文件类型
     *@param path
    *@return
     */
   private staticString guessMimeType(String path) {
        FileNameMap fileNameMap = URLConnection.getFileNameMap();
        String contentTypeFor = fileNameMap.getContentTypeFor(path);
       if(contentTypeFor ==null) {
            contentTypeFor ="application/octet-scontentTypeFortream";
        }
       returncontentTypeFor;
    }
}

回调类,一个请求开始,请求失败,请求成功:
     
public abstract classACallOkHttp implementsCallback {

   private inttag=0;
   privateClass<?>resultClass=null;
    Handlerhandler=newHandler() {
       @Override
       public voidhandleMessage(Message msg) {
           super.handleMessage(msg);
           switch(msg.what) {
               case1:
                    onResultRequest(msg.arg1, msg.obj);
                   break;
               case2:
                    onErrorRequest(msg.arg1, (String) msg.obj);
                   break;
            }
        }
    };

   @Override
   public voidonFailure(Request request, IOException e) {
        Message message =newMessage();
        message.obj= e.getLocalizedMessage();
        message.arg1=tag;
        message.what=2;
       handler.sendMessage(message);
    }

   @Override
   public voidonResponse(Response response) {
        Gson gson =newGson();
        String json =null;

       try{
            json = response.body().string();
          //   LogUtils.i("返回来的结果="+ json);
            Object bean = gson.fromJson(json,resultClass);
            Message message =newMessage();
            message.obj= bean;
            message.arg1=tag;
            message.what=1;
           handler.sendMessage(message);

        }catch(IOException e) {
            e.printStackTrace();
            onErrorRequest(tag,"JSON解析失败!");
        }
    }

   public voidregisterClass(Class<?> resultClass,inttag) {
       this.resultClass= resultClass;
       this.tag= tag;
    }

   /**
     * 请求开始
     *
     *@param tag 标签
     */
   public abstract voidonBeforeRequest(inttag);

   /**
     * 请求成功
     *
     *@param tag  标签
     *@param bean 实体类对象
     */
   public abstract voidonResultRequest(inttag, Object bean);

   /**
     * 请求失败
     *
     *@param tag 标签
     *@param e   错误信息
     */
   public abstract voidonErrorRequest(inttag, String e);


用法:
     
ConsultAllJson allJson =newConsultAllJson();
     allJson.setPage(1);
     allJson.setSize(100);
 
HttpOk.post(HttpPathUtils.HTTP_URL,allJson,newACallOkHttp() {
   @Override
   public voidonBeforeRequest(inttag) {
         //开始请求,可以显示一个进度条,什么的
    }

   
@Override
   public voidonResultRequest(int tag, Object bean) {
//成功之后直接强制一下,就拿到需要的实体类型了.
        ConsultAllJson consultAllJson = (ConsultAllJson) bean;
    }

   
@Override
   
public void onErrorRequest(inttag, String e) {

    }
},ConsultAllJson.class,1);

上传文本跟这个是一样的用法,就不写出来了.因为我们项目中只有psot请求,所有暂时也就写post请求,post上传文件,关于get请求,下载文件.会在下一章写出来.
   
                     以上只是我个人对okhttp的用法,如果有更好的可以一起指出来.一起探讨才能进步..
 QQ群 570278493; 欢迎加入.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值