热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

AndroidXutils3网络请求的封装详解及实例代码

这篇文章主要介绍了AndroidXutils3网络请求的封装详解及实例代码的相关资料,需要的朋友可以参考下

 Xutils3网络请求的封装详解

封装了一个Xutil3的网络请求工具类,分享给大家,本人水平有限,不足之处欢迎指出。

使用前先配置xutils3:

1.gradle中添加

compile 'org.xutils:xutils:3.3.40'

2.自定义Application

/**
 * Created by Joe on 2016/9/25.
 */
public class MyApp extends Application {
  @Override
  public void onCreate() {
    super.onCreate();

    x.Ext.init(this);
    x.Ext.setDebug(BuildConfig.DEBUG); // 是否输出debug日志, 开启debug会影响性能.
  }
}

3.清单文件application节点点添加

 android:name=".activitys.MyApp"

上面三步走完接下来就可以使用了

先写一个单利类,话不多说上代码

 private volatile static XutilsHttp instance;
  private Handler handler;
  private XutilsHttp(){
    handler = new Handler(Looper.getMainLooper());
  }

  /**
   * 单利模式
   * @return
   */
  public static XutilsHttp getInstance(){
    if (instance == null){
      synchronized (XutilsHttp.class){
        if (instance == null){
          instance = new XutilsHttp();
        }
      }
    }
    return instance;
  }

写好接口

 //接口回调
  public interface XCallBack{
    void onResponse(String result);
    void onFail(String result);
  }
  //下载的接口回调
  public interface XDownLoadCallBack{
    void onstart();
    void onLoading(long total,long current,boolean isDownloading);
    void onSuccess(File result);
    void onFail(String result);
    void onFinished();
  }

封装普通get请求

  /**
   * 普通get请求
   * @param url
   * @param maps
   * @param callback
   */
  public void get(String url, Map maps, final XCallBack callback){
    RequestParams params = new RequestParams(url);
    if (null != maps && !maps.isEmpty()){
      for (Map.Entry entry : maps.entrySet()){
        params.addQueryStringParameter(entry.getKey(),entry.getValue());
      }
    }
    x.http().get(params, new Callback.CommonCallback() {
      private boolean hasError = false;
      private String result = null;
      @Override
      public void onSuccess(String result) {
        if (result != null) {
          this.result = result;
        }
      }

      @Override
      public void onError(Throwable ex, boolean isOnCallback) {
        hasError = true;
        Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show();
      }

      @Override
      public void onCancelled(CancelledException cex) {

      }

      @Override
      public void onFinished() {
        if (!hasError && result != null) {
          onSuccessResponse(result,callback);
        }
      }
    });
  }

带缓存的get请求

 /**
   * 带缓存数据的异步get请求
   * @param url
   * @param maps
   * @param ifCache   是否缓存
   * @param cacheTime  缓存存活时间
   * @param callback
   */
  public void getCache(String url,Map maps,final boolean ifCache,long cacheTime,final XCallBack callback){
    RequestParams params = new RequestParams(url);
    params.setCacheMaxAge(cacheTime);
    if (null != maps && maps.isEmpty()){
      for (Map.Entry entry : maps.entrySet()){
        params.addQueryStringParameter(entry.getKey(),entry.getValue());
      }
    }
    x.http().get(params, new Callback.CacheCallback() {
      private boolean hasError = false;
      private String result = null;
      @Override
      public boolean onCache(String result) {
        if (ifCache && null != result){
          this.result = result;
        }
        // true: 信任缓存数据, 不在发起网络请求; false不信任缓存数据.
        return ifCache;
      }

      @Override
      public void onSuccess(String result) {
        if (result != null) {
          this.result = result;
        }
      }

      @Override
      public void onError(Throwable ex, boolean isOnCallback) {
        hasError = true;
        Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show();
      }

      @Override
      public void onCancelled(CancelledException cex) {

      }

      @Override
      public void onFinished() {
        if (!hasError && result != null) {
          onSuccessResponse(result,callback);
        }
      }
    });
  }

普通post请求

 /**
   * 异步post请求
   * @param url
   * @param maps
   * @param callback
   */
  public void post(String url, Map maps, final XCallBack callback){
    RequestParams params = new RequestParams(url);
    if (null != maps && !maps.isEmpty()){
      for (Map.Entry entry : maps.entrySet()){
        params.addBodyParameter(entry.getKey(),entry.getValue());
      }
    }
    x.http().post(params, new Callback.CommonCallback() {
      private boolean hasError = false;
      private String result = null;
      @Override
      public void onSuccess(String result) {
        if (result != null) {
          this.result = result;
        }
      }

      @Override
      public void onError(Throwable ex, boolean isOnCallback) {
        hasError = true;
        onFailResponse(ex.getMessage(),callback);
      }

      @Override
      public void onCancelled(CancelledException cex) {

      }

      @Override
      public void onFinished() {
        if (!hasError && result != null) {
          onSuccessResponse(result,callback);
        }
      }
    });
  }

带缓存的post请求

  /**
   * 带缓存数据的异步post请求
   * @param url
   * @param maps
   * @param ifCache   是否缓存
   * @param cacheTime  缓存存活时间
   * @param callback
   */
  public void postCache(String url,Map maps,final boolean ifCache,long cacheTime,final XCallBack callback){
    RequestParams params = new RequestParams(url);
    params.setCacheMaxAge(cacheTime);
    if (null != maps && maps.isEmpty()){
      for (Map.Entry entry : maps.entrySet()){
        params.addBodyParameter(entry.getKey(),entry.getValue());
      }
    }
    x.http().get(params, new Callback.CacheCallback() {
      private boolean hasError = false;
      private String result = null;
      @Override
      public boolean onCache(String result) {
        if (ifCache && null != result){
          this.result = result;
        }
        // true: 信任缓存数据, 不在发起网络请求; false不信任缓存数据.
        return ifCache;
      }

      @Override
      public void onSuccess(String result) {
        if (result != null) {
          this.result = result;
        }
      }

      @Override
      public void onError(Throwable ex, boolean isOnCallback) {
        hasError = true;
        Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show();
      }

      @Override
      public void onCancelled(CancelledException cex) {

      }

      @Override
      public void onFinished() {
        if (!hasError && result != null) {
          onSuccessResponse(result,callback);
        }
      }
    });
  }

文件的下载

  /**
   * 下载文件
   * @param url
   * @param filePath
   * @param callback
   */
  public void downFile(String url, String filePath, final XDownLoadCallBack callback){
    RequestParams params = new RequestParams(url);
    params.setSaveFilePath(filePath);
    params.setAutoRename(true);
    x.http().get(params, new Callback.ProgressCallback() {
      @Override
      public void onSuccess(final File result) {
        //下载完成会走该方法
        handler.post(new Runnable() {
          @Override
          public void run() {
            if (callback!=null){
              callback.onSuccess(result);
            }
          }
        });
      }
      @Override
      public void onError(final Throwable ex, boolean isOnCallback) {
        handler.post(new Runnable() {
          @Override
          public void run() {
            if (null != callback){
              callback.onFail(ex.getMessage());
            }
          }
        });
      }
      @Override
      public void onCancelled(CancelledException cex) {
      }
      @Override
      public void onFinished() {
        handler.post(new Runnable() {
          @Override
          public void run() {
            if (callback!=null){
              callback.onFinished();
            }
          }
        });
      }
      //网络请求之前回调
      @Override
      public void onWaiting() {
      }
      //网络请求开始的时候回调
      @Override
      public void onStarted() {
        handler.post(new Runnable() {
          @Override
          public void run() {
            if (null != callback){
              callback.onstart();
            }
          }
        });
      }
      //下载的时候不断回调的方法
      @Override
      public void onLoading(final long total, final long current, final boolean isDownloading) {
        //当前进度和文件总大小
        handler.post(new Runnable() {
          @Override
          public void run() {
            if (callback!=null){
              callback.onLoading(total,current,isDownloading);
            }
          }
        });
      }
    });
  }

文件的上传

  /**
   * 文件上传
   *
   * @param url
   * @param maps
   * @param file
   * @param callback
   */
  public void upLoadFile(String url, Map maps, Map file, final XCallBack callback) {
    RequestParams params = new RequestParams(url);
    if (maps != null && !maps.isEmpty()) {
      for (Map.Entry entry : maps.entrySet()) {
        params.addBodyParameter(entry.getKey(), entry.getValue());
      }
    }
    if (file != null) {
      for (Map.Entry entry : file.entrySet()) {
        params.addBodyParameter(entry.getKey(), entry.getValue().getAbsoluteFile());
      }
    }
    // 有上传文件时使用multipart表单, 否则上传原始文件流.
    params.setMultipart(true);
    x.http().post(params, new Callback.CommonCallback() {
      @Override
      public void onSuccess(String result) {
        onSuccessResponse(result, callback);
      }

      @Override
      public void onError(Throwable ex, boolean isOnCallback) {

      }

      @Override
      public void onCancelled(CancelledException cex) {

      }

      @Override
      public void onFinished() {

      }
    });

  }

上传Json字符串到服务器

  /**
   * 上传Json串到服务器
   * @param url
   * @param maps 将需要传的各个参数放在Map集合里面
   */
  public void upLoadJson(String url, Map maps, final XCallBack callback){
    JSONObject js_request = new JSONObject();//服务器需要传参的json对象
    try {
      for (Map.Entry entry : maps.entrySet()){
        js_request.put(entry.getKey(),entry.getValue());
      }
    } catch (JSONException e) {
      e.printStackTrace();
    }

    RequestParams params = new RequestParams(url);
    params.setAsJsonContent(true);
    params.setBodyContent(js_request.toString());

    x.http().post(params, new Callback.CommonCallback() {//发起传参为json的post请求,
      // Callback.CacheCallback的泛型为后台返回数据的类型,
      // 根据实际需求更改
      private boolean hasError = false;
      private String result = null;

      @Override
      public void onSuccess(String result) {
        if (result != null) {
          this.result = result;
        }
      }

      @Override
      public void onError(Throwable ex, boolean isOnCallback) {
        ex.printStackTrace();
      }

      @Override
      public void onCancelled(CancelledException cex) {

      }

      @Override
      public void onFinished() {
        if (!hasError && result != null && callback!=null) {
          onSuccessResponse(result,callback);
        }
      }
    });

  }

使用案例:

下载调用:

   XutilsHttp.getInstance().downFile(url, Utils.getSDPath() + "/" + "ShopBox_Guide_Video/" + Utils.getFileName(url), new XutilsHttp.XDownLoadCallBack() {

      @Override
      public void onstart() {
        showDialog(DIALOG_DOWNLOAD_PROGRESS);
      }

      @Override
      public void onLoading(long total, long current, boolean isDownloading) {
        //当前进度和文件总大小
        mProgressDialog.setMax((int) total);
        mProgressDialog.setProgress((int) current);
      }

      @Override
      public void onSuccess(File result) {
        //下载完成会走该方法
        playMedia(result.getPath());
      }

      @Override
      public void onFail(String result) {
        Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
      }

      @Override
      public void onFinished() {
        dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
      }
    });

带缓存get请求

   XutilsHttp.getInstance().postCache(url, null, true, 60000, new XutilsHttp.XCallBack() {
      @Override
      public void onResponse(String result) {
        // 成功获取数据
      }

      @Override
      public void onFail(String result) {
        Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
      }
    });

就是这么简单,不足之处请大家多多指点

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


推荐阅读
  • 开发笔记:深度探索!Android之OkHttp网络架构源码解析
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了深度探索!Android之OkHttp网络架构源码解析相关的知识,希望对你有一定的参考价值。 ... [详细]
  •   uni-app开发教程,uni-app实例教程  UNI-APP开发(仿饿)开发课程:进入学习  推荐(免费):uni-app开发教程  文章目录  简介,网 ... [详细]
  • crossorigin注解添加了解决不了跨域问题_CORS与@CrossOrigin详解
    1、跨域的基本概念a、跨域的解释要了解跨域,首先需要知晓浏览器的同源策略,简单的说就是两个请求协议、端口、主机都相同,则两个请求具有相同的 ... [详细]
  • 1.安装cordovapluginaddcordova-plugin-file-transfercordovapluginaddcordova-plugin-fi ... [详细]
  • 摘要:本文中,我们将进一步理解微服务架构的核心要点和实现原理,为读者的实践提供微服务的设计模式,以期让微服务在读者正在工作的 ... [详细]
  • PHPcURL获取微信公众号access_token的实例php实例:这篇文章主要介绍了PHPcURL获取微信公众号access_token的实例,需要的朋友可以参考下1.开发微信 ... [详细]
  • 抓取百万知乎用户设计之实体设计
    一.实体的关系实体是根据返回的Json数据来设计的教育经历方面用户可以有很多教育经理,USER和education是一对多的关系,一个education对应一个education一 ... [详细]
  • 【自制小工具】代码生成器
    【自制小工具】代码生成器陆陆续续接触过好几款代码生成工具,发现确实好用,但都会有那么点不完善的地方,所以索性就自己做一个吧。界面非常简单,反正是自己用的,简单点用起来也方便上图:左 ... [详细]
  • kepserver中文手册,kepserver使用教程,kepserver设置
    下面介绍一下KepServer模拟器的使用,以下示例使用服务器随附的Simulator驱动程序来演示创建、配置和运行项目的过程。Simulator驱动程序是基于内存的驱动程序,能为 ... [详细]
  • 本文目录一览:1、数据库有哪几种2、数据库软件 ... [详细]
  • socket.io是个基于node.js的快平台实时通讯框架。只用不到10行代码,就可以搭建一个简单的多人实时聊天室。先来看看运行后的效果:socket.io多人聊天室只要简单几 ... [详细]
  • 目录结构如下:Nginx基础知识NginxHTTP服务器的特色及优点Nginx的主要企业功能Nginx作为web服务器的主要应用场景包括:Nginx的安装安装环境 ... [详细]
  • 文章目录前言必知必会的软件服务器分类机架式服务器塔式服务器刀片式服务器三者的区别虚拟服务器(云服务器)服务器的硬件组成服务器常见的品牌前言本文是循序渐进学linux的第一课,为 ... [详细]
  • 步骤一:明确主打的核心目标用户群(对应产品侧的定位)这个核心目标用户群体是该产品成功挤进市场的切入点,甚至是撬动市场的支点和撬杠。市面上几乎很少有产品是专门给一个群体用而对其他群体 ... [详细]
  • AsyncDisplayKit2.0教程(下)
    AsyncDisplayKit2.0Tutorial:AutomaticLayout原文:AsyncDisplayKit2.0Tutorial:Automatic ... [详细]
author-avatar
相对论!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有