网络设计之xutils网络库

xutils官方 这是xutils 官方

这是xutils 3 的 官方解释

xUtils 包含了orm, http(s), image, view注解, 但依然很轻量级(246K), 并且特性强大, 方便扩展:

稳定的基石: AbsTask和统一的回调接口Callback, 任何异常, 即使你的回调方法实现有异常都会进入onError, 任何情况下onFinished总会让你知道任务结束了.

基于高效稳定的orm工具, http模块得以更方便的实现cookie(支持domain, path, expiry等特性)和 缓存(支持Cache-Control, Last-Modified, ETag等特性)的支持.

有了强大的http及其下载缓存的支持, image模块的实现相当的简洁, 并且支持回收被view持有, 但被Mem Cache移除的图片, 减少页面回退时的闪烁..

view注解模块仅仅400多行代码却灵活的支持了各种View注入和事件绑定, 包括拥有多了方法的listener的支持.

其他特性

支持超大文件(超过2G)上传

更全面的http请求协议支持(11种谓词)

拥有更加灵活的ORM, 和greenDao一致的性能

更多的事件注解支持且不受混淆影响...

图片绑定支持gif(受系统兼容性影响, 部分gif文件只能静态显示), webp; 支持圆角, 圆形, 方形等裁剪, 支持自动旋转...

从3.5.0开始不再包含libwebpbackport.so, 需要在Android4.2以下设备兼容webp的请使用3.4.0版本.

使用Gradle构建时添加一下依赖即可:

compile'org.xutils:xutils:3.5.0'

看完这些你肯定会觉得很强大 这是一个很稳定的网络库 肯定会有很多人不理解 这是几年前的框架了 为什么还在研究这一块 ?

是啊 在相对日日迭代更新的时代 xutils 的是一个相对来说老一点的网络库 这也是和 okhttp reteofit和rxjava 等相对新一点的网络库而言的 utils 的最新版本是3.5.0 更新时间是一年前 时间间隔较久 不知道是否还有维护 

说到这里 我们说一下xutils 的强大功能吧 

xutils 3 以上官方已经介绍的很详细了 我就简单的说一下 主要的功能 主要就是四个模块

网络请求 这也是最主要的 我看中xutils的原因是两个 一是大文件上传下载速度很快  二是 可封装程度很高

(相当于okhttp)

注解 注解对我们来说能简化我们很多一些初始化试图和绑定数据的代码  (相当于Butterknife) android 原生的自定义注解是远远满足不了我们的需求的 自定义注解也会花费我们很多时间 所以为了简单方便一个好用的注解框架很有必要

绑定图片 xutils 支持绑定图片 例如 本地图片 网络图片 bitmap 和 资源文件图片等 都可以直接绑定 (相当于picasso) 当然他还可以设置图片的属性 例如圆角 透明度等

第四 也是一个很主要的功能 就是数据库 我们在项目中肯定会用到数据库进行数据存储 (相当于sqlite)

综上所述 你还觉得xutils 不强大吗 ?

我列个等式 再看一下

xutils = okhttp + Butterknife + picasso + sqlite;

没错就是这么强大 也许你以为有点老 但是功能这一块还是很牛x 的 兼容性这一块做的也很不错 至少在android 4.0-android 8.0 都能兼容到 至于9.0 现在还是未知 4.0以前也提供了兼容方案

好了 主要的介绍已经做完了 现在说说xutils 的 网络请求吧

选择第三方的框架 要根据自己的产品去选择 合适自己的才是最好的 这里我只是对xutils 3 的一些实用总结

首先我们要先将xutils 3 加入到我们的项目 老规矩介绍一下IDE --->AS

新建一个项目 XutilsDemo

项目结构如下


demo

加入 xutils 3 

dependencies {

compile fileTree(dir:'libs',include: ['*.jar'])

androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {

excludegroup:'com.android.support',module:'support-annotations'

    })

compile'com.android.support:appcompat-v7:25.+'

    compile'com.android.support.constraint:constraint-layout:1.0.2'

    compile'org.xutils:xutils:3.5.0'

    testCompile'junit:junit:4.12'

}

创建application 并注册

public class MyAppextends Application {

@Override

    public void onCreate() {

super.onCreate();

        x.Ext.init(this); // 初始化xutils

    }

}


    android:name=".MyApp"

    android:allowBackup="true"

    android:icon="@mipmap/ic_launcher"

    android:label="@string/app_name"

    android:roundIcon="@mipmap/ic_launcher_round"

    android:supportsRtl="true"

    android:theme="@style/AppTheme">

添加相关权限

uses-permission android:name="android.permission.INTERNET"

uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"

好 已完成准备工作

简单的get请求 

RequestParams request =new RequestParams("http.xxx");

x.http().get(request, new Callback.CommonCallback() {

@Override

    public void onSuccess(String result) {

}

@Override

    public void onError(Throwable ex, boolean isOnCallback) {

}

@Override

    public void onCancelled(CancelledException cex) {

}

@Override

    public void onFinished() {

}

});


简单的post请求 

RequestParams request =new RequestParams("http.xxx");

JSONObject object =new JSONObject();

try {

object.put("age",28);

    object.put("name","齐达内");

    object.put("event","回家了");

}catch (JSONException e) {

e.printStackTrace();

}

request.setBodyContent(object.toString());

x.http().post(request, new Callback.CommonCallback() {

@Override

    public void onSuccess(String result) {

}

@Override

    public void onError(Throwable ex, boolean isOnCallback) {

}

@Override

    public void onCancelled(CancelledException cex) {

}

@Override

    public void onFinished() {

}

});

简单的put请求

RequestParams request =new RequestParams("http.xxx");

JSONObject object =new JSONObject();

try {

object.put("age",28);

    object.put("name","齐达内");

    object.put("event","回家了");

}catch (JSONException e) {

e.printStackTrace();

}

request.setBodyContent(object.toString());

x.http().request(HttpMethod.PUT, request, new Callback.CommonCallback() {

@Override

    public void onSuccess(String result) {

}

@Override

    public void onError(Throwable ex, boolean isOnCallback) {

}

@Override

    public void onCancelled(CancelledException cex) {

}

@Override

    public void onFinished() {

}

});

简单的delet请求

RequestParams request =new RequestParams("http.xxx");

x.http().request(HttpMethod.DELETE, request, new Callback.CommonCallback() {

@Override

    public void onSuccess(String result) {

}

@Override

    public void onError(Throwable ex, boolean isOnCallback) {

}

@Override

    public void onCancelled(CancelledException cex) {

}

@Override

    public void onFinished() {

}

});

好下面就是对应我们的封装设计 根据项目需求 不要盲目跟风

一般情况下 get post put delete等等 都是固定的 后台会设计一些头参数 和 错误状态 等等  我们开始封装

新建一个XutilsHelper 

package com.nade.utils.xutilsdemo;

import org.json.JSONObject;

import org.xutils.common.Callback;

import org.xutils.http.HttpMethod;

import org.xutils.http.RequestParams;

import org.xutils.x;

/**

* 作者: Nade_S on 2018/7/9.

*/

public class XutilsHelper {

private static RequestParamsparams;

    /**

    * 获取请求体 设置头参数

    * @param url

    * @param type

    * @return

    */

    public static RequestParamsgetParams(String url,int type){

if (null ==params){

synchronized (XutilsHelper.class){

if (null ==params){

params =new RequestParams(url);

                }

}

}

return addHeader(params, type);

    }

/**

*

    * @param params 请求体

    * @param type 请求类型

    * @return

    */

    private static RequestParamsaddHeader(RequestParams params,int type) {

switch (type){

case 0:// 没有请求头

                break;

            case 1:// 请求格式 与 参数

                params.addHeader("Content-Type","application/json");

                params.addHeader("key","value");

                params.addHeader("key","value");

break;

            case 2:// 请求格式 与 参数

                params.addHeader("Content-Type","multipart/form-data");

                params.addHeader("key","value");

                params.addHeader("key","value");

                params.addHeader("key","value");

break;

            case 3:// 其他格式 根据后台设置即可

                params.addHeader("Content-Type","type");

                params.addHeader("key","value");

                params.addHeader("key","value");

                params.addHeader("key","value");

                params.addHeader("key","value");

                params.addHeader("key","value");

break;

            default:

params.addHeader("key","value");

                params.addHeader("key","value");

                params.addHeader("key","value");

                params.addHeader("key","value");

                params.addHeader("key","value");

break;

        }

return params;

    }

/**

    * get 方法

    * @param params

    * @param listener 监听

    */

    public static void XGET(RequestParams params, JSONObject object,final XutilsListener listener){

if (object==null){

params.addBodyParameter("params",object.toString());

        }

x.http().get(params, new Callback.CommonCallback() {

@Override

            public void onSuccess(String result) {

listener.xSuccess(result);

                // 此处可处理 服务器定义的内部错误

              // listener.xErrCode();

            }

@Override

            public void onError(Throwable ex, boolean isOnCallback) {

listener.xError(ex);

                // 此处可处理 服务器定义的外部错误

              //  listener.xErrCode();

            }

@Override

            public void onCancelled(CancelledException cex) {

}

@Override

            public void onFinished() {

}

});

    }

/**

    * post 方法

    * @param params

    * @param listener 监听

    */

    public static void XPOST(RequestParams params, JSONObject object,final XutilsListener listener){

if (object !=null){

params.setBodyContent(object.toString());

        }

x.http().post(params, new Callback.CommonCallback() {

@Override

            public void onSuccess(String result) {

listener.xSuccess(result);

                // 此处可处理 服务器定义的内部错误

                // listener.xErrCode();

            }

@Override

            public void onError(Throwable ex, boolean isOnCallback) {

listener.xError(ex);

                // 此处可处理 服务器定义的外部错误

                //  listener.xErrCode();

            }

@Override

            public void onCancelled(CancelledException cex) {

}

@Override

            public void onFinished() {

}

});

    }

/**

* put

    * @param params

    * @param listener 监听

    */

    public static void XPUT(RequestParams params, JSONObject object,final XutilsListener listener){

if (object !=null){

params.setBodyContent(object.toString());

        }

x.http().request(HttpMethod.PUT, params, new Callback.CommonCallback() {

@Override

            public void onSuccess(String result) {

listener.xSuccess(result);

                // 此处可处理 服务器定义的内部错误

                // listener.xErrCode();

            }

@Override

            public void onError(Throwable ex, boolean isOnCallback) {

listener.xError(ex);

                // 此处可处理 服务器定义的外部错误

                //  listener.xErrCode();

            }

@Override

            public void onCancelled(CancelledException cex) {

}

@Override

            public void onFinished() {

}

});

    }

/**

* delete

    * @param params

    * @param listener 监听

    */

    public static void XDELETE(RequestParams params, JSONObject object,final XutilsListener listener){

if (object!=null){

params.addBodyParameter("params",object.toString());

        }

x.http().request(HttpMethod.DELETE, params, new Callback.CommonCallback() {

@Override

            public void onSuccess(String result) {

listener.xSuccess(result);

                // 此处可处理 服务器定义的内部错误

                // listener.xErrCode();

            }

@Override

            public void onError(Throwable ex, boolean isOnCallback) {

listener.xError(ex);

                // 此处可处理 服务器定义的外部错误

                //  listener.xErrCode();

            }

@Override

            public void onCancelled(CancelledException cex) {

}

@Override

            public void onFinished() {

}

});

    }

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    // mvc

    RequestParams params = XutilsHelper.getParams("url",Constant.XUTILS_NULLH);

    XutilsHelper.XGET(params, null,new XutilsListener() {

@Override

        public void xSuccess(String result) {

}

@Override

        public void xErrCode(int code) {

}

@Override

        public void xError(Throwable err) {

}

});

}

// mvp 使用

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    // mvp

    XutilsPresenter xutilsPresenter =new XutilsPresenter(this);

    xutilsPresenter.login();

}

@Override

public void loginSuccess(String result) {

Log.d("login", "loginSuccess: 登陆成功--"+result);

}

@Override

public void loginCode(int code) {

Log.d("login", "loginCode: 登录失败错误码--"+code);

}

@Override

public void loginError(Throwable ex) {

Log.d("login", "loginError: 登录失败--"+ex);

}

@Override

public void showPro() {

// 展示进度条

}

@Override

public void hintPro() {

// 隐藏进度条

}


好 本文就完结了 demo mvp 及源码  点击 下载demo

如有疑问 欢迎留言或私信

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

推荐阅读更多精彩内容