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 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
如有疑问 欢迎留言或私信