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();
      }
    });

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

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

(0)

相关推荐

  • 微信小程序网络请求的封装与填坑之路

    以前写过一篇关于微信小程序上拉加载,上拉刷新的文章,今天写的是关于小程序网络请求的封装. 在这里首先声明一个小程序文档的bug,导致大伙们在请求的时候,服务器收到不到参数的问题 示例代码: wx.request({ url: 'test.php', //仅为示例,并非真实的接口地址 data: { x: '' , y: '' }, header: { 'Content-Type': 'application/json' }, success: function(res) { console.lo

  • 实例讲解Python中SocketServer模块处理网络请求的用法

    SocketServer创建一个网络服务框架.它定义了类来处理TCP,UDP, UNIX streams 和UNIX datagrams上的同步网络请求. 一.Server Types 有五个不同的服务器类在SocketServer中. 1.BaseServer定义了API, 而且他不是用来实例化和直接使用的. 2.TCPServer用作TCP/IP的socket通讯. 3.UDPServer使用datagram sockets. 4.UnixStreamServer和UnixDatagramS

  • 微信小程序 http请求封装详解及实例代码

    微信小程序  http请求封装 示例代码 wx.request({ url: 'test.php', //仅为示例,并非真实的接口地址 data: { x: '' , y: '' }, method:'POST', header: { 'content-type': 'application/json' }, success: function(res) { console.log(res.data) }, fail: function( res ) { fail( res ); } }) 以上

  • 微信小程序 封装http请求实例详解

    微信小程序 封装http请求 最近看了一下微信小程序,大致翻了一下,发现跟angular很相似的,但是比angular简单的很多具体可参考官方文档 https://mp.weixin.qq.com/debug/wxadoc/dev/framework/app-service/page.html?t=2017112 下面将封装http请求服务部分的服务以及引用部分 // 本服务用于封装请求 // 返回的是一个promisepromise var sendRrquest = function (ur

  • 微信小程序 网络请求API详解

    wx.request(OBJECT)发起的是https请求.一个微信小程序,同时只能有5个网络请求连接. OBJECT参数说明: 效果图: net.js Page({ data:{ result:{}, }, onLoad:function(options){ this.getDate('http://baobab.wandoujia.com/api/v2/feed?num=2'); }, /** * 网络请求的函数:接收一个URL参数 */ getDate:function(URL){ var

  • iOS开发中使用NSURLConnection类处理网络请求的方法

    NSURLConnection 作为 Core Foundation / CFNetwork 框架的 API 之上的一个抽象,在 2003 年,随着第一版的 Safari 的发布就发布了.NSURLConnection 这个名字,实际上是指代的 Foundation 框架的 URL 加载系统中一系列有关联的组件:NSURLRequest.NSURLResponse.NSURLProtocol. NSURLCache. NSHTTPCookieStorage.NSURLCredentialStor

  • Android最基本的异步网络请求框架

    本篇文章我们来一起写一个最基本的Android异步网络请求框架,借此来了解下Android中网络请求的相关知识.由于个人水平有限,文中难免存在疏忽和谬误,希望大家可以指出,谢谢大家. 1. 同步网络请求 以HTTP的GET请求为例,我们来介绍一下Android中一个基本的同步请求框架的实现.直接贴代码: public class HttpUtils { public static byte[] get(String urlString) { HttpURLConnection urlConnec

  • Android网络请求库android-async-http介绍

    Android网络请求库:android-async-http开源框架 之前有一篇描述了客户端请求服务器端的方式-Post的请求方式.今天介绍一个请求服务器的一个开源库-android-async-http库. 1. 概念: 这个网络请求库是基于Apache HttpClient库之上的一个异步网络请求处理库,网络处理均基于Android的非UI线程,通过回调方法(匿名内部类)处理请求结果. 2. 特征: (1).处理异步Http请求,并通过匿名内部类处理回调结果 **(2).**Http异步请

  • 微信小程序 POST请求(网络请求)详解及实例代码

    微信小程序 POST请求 微信小程序开发中网络请求必不可少.GET.POST请求是最常用的.GET请求,POST请求的时候有好几个坑.我已经为大家填好了. <img src="http://img.blog.csdn.net/20161017170933243?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Cente

  • 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(

  • 微信小程序网络请求wx.request详解及实例

    微信小程序网络请求wx.request详解及实例 如果说小程序API里面最重要一个接口是哪一个?那么首推wx.request().相当于在小程序内请发起一个https请求(本地调试模式下支持HTTP).HTTP协议中共定义了八种方法或者叫"动作"来表明对Request-URI指定的资源的不同操作方式. GET:向特定的资源发出请求. POST:向指定资源提交数据进行处理请求.数据被包含在请求体中. PUT:向指定资源位置上传其最新内容. DELETE:请求服务器删除Request-UR

  • Flutter 网络请求框架封装详解

     Flutter 请求网络的三种方式 flutter 请求网络的方式有三种,分别是 Dart 原生的网络请求 HttpClient.第三方网络请求 http以及 Flutter 中的 Dio.我们可以比较一下这三种网络请求方式,然后封装为我们方便请求网络的工具类. Dart 原生的网络请求 HttpClient 实现 Dart 获取网络数据的请求,一般我们需要以下几个步骤: step 1: 原生的网络请求时不需要修改 pubspec.yaml 文件的,我们只需要在使用的地方引入所需包就可以了 i

  • 微信小程序  http请求封装详解及实例代码

    微信小程序  http请求封装 示例代码 wx.request({ url: 'test.php', //仅为示例,并非真实的接口地址 data: { x: '' , y: '' }, method:'POST', header: { 'content-type': 'application/json' }, success: function(res) { console.log(res.data) }, fail: function( res ) { fail( res ); } }) 以上

  • Android 软引用和弱引用详解及实例代码

    Android 软引用 和 弱引用    1.  SoftReference<T>:软引用-->当虚拟机内存不足时,将会回收它指向的对象:需要获取对象时,可以调用get方法. 2.  WeakReference<T>:弱引用-->随时可能会被垃圾回收器回收,不一定要等到虚拟机内存不足时才强制回收.要获取对象时,同样可以调用get方法. 3. WeakReference一般用来防止内存泄漏,要保证内存被虚拟机回收,SoftReference多用作来实现缓存机制(cache

  • Android SharedPreferences存取操作以及封装详解

    存 首先初始化 private SP sp; sp = new SP( context ); 存入数据 第一个参数为上下文,第二个参数为key,第三个参数为要存入的数据Value sp.PutData( context,"AccessToken",AccessToken ); 取 初始化 private SP sp; sp = new SP( context ); 取出数据 第一个参数为上下文,第二个参数为存入数据时定义的名称,第三个数据为取出数据的默认类型(这个参数很关键,再封装类转

  • Android startActivityForResult的调用与封装详解

    目录 前言 一.原生的使用 二.对原生的封装Ghost 三.Result Api 的使用 四.Result Api 的封装 4.1 封装简化创建方式 4.2 自动注册/按需注册 总结 前言 startActivityForResult 可以说是我们常用的一种操作了,用于启动新页面并拿到这个页面返回的数据,是两个 Activity 交互的基本操作. 虽然可以通过接口,消息总线,单例池,ViewModel 等多种方法来间接的实现这样一个功能,但是 startActivityForResult 还是使

  • Android Dialog详解及实例代码

     Android Dialog详解及实例代码 概述: Android开发中最常用的就是Dialog类,除了自定义dialog布局,最多的就是用在弹出对话框.进度条.输入框.单选.复选框. 1.选择对话框: AlertDialog.Builder dialog = new AlertDialog.Builder(this); dialog.setTitle("选择对话框"); dialog.setMessage("请选择确认或取消"); dialog.setCance

  • Android ViewPagerIndicator详解及实例代码

    Android ViewPagerIndicator详解及实例代码 关于自定义View的属性零碎知识 自定义View和自定义属性的知识不再此提及,这里着重说的是属性在自定义View中的获取方式,自定义的属性如下: <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="Wisely"> <attr name=&

随机推荐