网络设计之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

项目结构如下


网络设计之xutils网络库_第1张图片
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

如有疑问 欢迎留言或私信


网络设计之xutils网络库_第2张图片
加群交流

你可能感兴趣的:(网络设计之xutils网络库)