全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

 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<String,String> maps, final XCallBack callback){
    RequestParams params = new RequestParams(url);
    if (null != maps && !maps.isEmpty()){
      for (Map.Entry<String,String> entry : maps.entrySet()){
        params.addQueryStringParameter(entry.getKey(),entry.getValue());
      }
    }
    x.http().get(params, new Callback.CommonCallback<String>() {
      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<String,String> 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<String,String> entry : maps.entrySet()){
        params.addQueryStringParameter(entry.getKey(),entry.getValue());
      }
    }
    x.http().get(params, new Callback.CacheCallback<String>() {
      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<String,String> maps, final XCallBack callback){
    RequestParams params = new RequestParams(url);
    if (null != maps && !maps.isEmpty()){
      for (Map.Entry<String,String> entry : maps.entrySet()){
        params.addBodyParameter(entry.getKey(),entry.getValue());
      }
    }
    x.http().post(params, new Callback.CommonCallback<String>() {
      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<String,String> 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<String,String> entry : maps.entrySet()){
        params.addBodyParameter(entry.getKey(),entry.getValue());
      }
    }
    x.http().get(params, new Callback.CacheCallback<String>() {
      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<File>() {
      @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<String, String> maps, Map<String, File> file, final XCallBack callback) {
    RequestParams params = new RequestParams(url);
    if (maps != null && !maps.isEmpty()) {
      for (Map.Entry<String, String> entry : maps.entrySet()) {
        params.addBodyParameter(entry.getKey(), entry.getValue());
      }
    }
    if (file != null) {
      for (Map.Entry<String, File> entry : file.entrySet()) {
        params.addBodyParameter(entry.getKey(), entry.getValue().getAbsoluteFile());
      }
    }
    // 有上传文件时使用multipart表单, 否则上传原始文件流.
    params.setMultipart(true);
    x.http().post(params, new Callback.CommonCallback<String>() {
      @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<String, String> maps, final XCallBack callback){
    JSONObject js_request = new JSONObject();//服务器需要传参的json对象
    try {
      for (Map.Entry<String,String> 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<String>() {//发起传参为json的post请求,
      // Callback.CacheCallback<String>的泛型为后台返回数据的类型,
      // 根据实际需求更改
      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  # Xutils3网络请求的封装  # Xutils3网络请求的封装详解  # Xutils3  # Android中网络框架简单封装的实例方法  # Android 中Volley二次封装并实现网络请求缓存  # Android基于OkHttpUtils网络请求的二次封装  # 初学Android之网络封装实例  # 回调  # 上传  # 不信任  # 不足之处  # 下载完成  # 放在  # 不多  # 希望能  # 给大家  # 自定义  # 谢谢大家  # 表单  # 装了  # 这么简单  # 三步  # 写好  # 前先  # 就可以  # 走完  # 请大家多多 


相关文章: 建站之星在线版空间:自助建站+智能模板一键生成方案  网站设计制作公司地址,网站建设比较好的公司都有哪些?  如何基于PHP生成高效IDC网络公司建站源码?  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  行程制作网站有哪些,第三方机票电子行程单怎么开?  建站主机是否属于云主机类型?  如何选择高效便捷的WAP商城建站系统?  建站之星价格显示格式升级,你的预算足够吗?  教学网站制作软件,学习*后期制作的网站有哪些?  西安大型网站制作公司,西安招聘网站最好的是哪个?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  php8.4新语法match怎么用_php8.4match表达式替代switch【方法】  宝塔建站无法访问?如何排查配置与端口问题?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  网站制作多少钱一个,建一个论坛网站大约需要多少钱?  微信推文制作网站有哪些,怎么做微信推文,急?  盘锦网站制作公司,盘锦大洼有多少5G网站?  如何基于云服务器快速搭建网站及云盘系统?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  名字制作网站免费,所有小说网站的名字?  建站之星备案是否影响网站上线时间?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  如何用IIS7快速搭建并优化网站站点?  建站之星各版本价格是多少?  制作网站的软件免费下载,免费制作app哪个平台好?  ,巨量百应是干嘛的?  如何实现建站之星域名转发设置?  寿县云建站:智能SEO优化与多行业模板快速上线指南  学校免费自助建站系统:智能生成+拖拽设计+多端适配  如何用y主机助手快速搭建网站?  定制建站流程步骤详解:一站式方案设计与开发指南  青岛网站建设如何选择本地服务器?  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  外贸公司网站制作,外贸网站建设一般有哪些步骤?  如何选择适配移动端的WAP自助建站平台?  盐城做公司网站,江苏电子版退休证办理流程?  唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?  如何登录建站主机?访问步骤全解析  外贸公司网站制作哪家好,maersk船公司官网?  建站之星免费版是否永久可用?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  如何获取开源自助建站系统免费下载链接?  制作网站的模板软件,网站怎么建设?  北京网站制作的公司有哪些,北京白云观官方网站?  ,交易猫的商品怎么发布到网站上去?  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?  c# 在高并发场景下,委托和接口调用的性能对比  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  如何通过网站建站时间优化SEO与用户体验?  南京网站制作费用,南京远驱官方网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。