Android 工具包 xUtils

Apache
Java C/C++ 查看源码»
Android
2013-07-28
红薯
## xUtils3简介
* 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构建时添加一下依赖即可:
```javascript
compile 'org.xutils:xutils:3.5.0'
```
##### 如果使用eclipse可以 [点击这里下载aar文件](http://dl.bintray.com/wyouflf/maven/org/xutils/xutils/), 然后用zip解压, 取出jar文件.
##### 混淆配置参考示例项目sample的配置


#### 常见问题:
1. 更好的管理图片缓存: https://github.com/wyouflf/xUtils3/issues/149
2. Cookie的使用: https://github.com/wyouflf/xUtils3/issues/125
3. 关于query参数? http请求可以通过 header, url, body(请求体)传参; query参数是url中问号(?)后面的参数.
4. 关于body参数? body参数只有PUT, POST, PATCH, DELETE(老版本RFC2616文档没有明确指出它是否支持, 所以暂时支持)请求支持.
5. 自定义Http参数对象和结果解析: https://github.com/wyouflf/xUtils3/issues/191

#### 使用前配置
##### 需要的权限
```xml


```
##### 初始化
```java
// 在application的onCreate中初始化
@Override
public void onCreate() {
    super.onCreate();
    x.Ext.init(this);
    x.Ext.setDebug(BuildConfig.DEBUG); // 是否输出debug日志, 开启debug会影响性能.
    ...
}
```

### 使用@Event事件注解(@ContentView, @ViewInject等更多示例参考sample项目)
```java
/**
 * 1. 方法必须私有限定,
 * 2. 方法参数形式必须和type对应的Listener接口一致.
 * 3. 注解参数value支持数组: value={id1, id2, id3}
 * 4. 其它参数说明见{@link org.xutils.event.annotation.Event}类的说明.
 **/
@Event(value = R.id.btn_test_baidu1,
        type = View.OnClickListener.class/*可选参数, 默认是View.OnClickListener.class*/)
private void onTestBaidu1Click(View view) {
...
}
```

### 访问网络(更多示例参考sample项目)
```java
/**
 * 自定义实体参数类请参考:
 * 请求注解 {@link org.xutils.http.annotation.HttpRequest}
 * 请求注解处理模板接口 {@link org.xutils.http.app.ParamsBuilder}
 *
 * 需要自定义类型作为callback的泛型时, 参考:
 * 响应注解 {@link org.xutils.http.annotation.HttpResponse}
 * 响应注解处理模板接口 {@link org.xutils.http.app.ResponseParser}
 *
 * 示例: 查看 org.xutils.sample.http 包里的代码
 */
BaiduParams params = new BaiduParams();
params.wd = "xUtils";
// 有上传文件时使用multipart表单, 否则上传原始文件流.
// params.setMultipart(true);
// 上传文件方式 1
// params.uploadFile = new File("/sdcard/test.txt");
// 上传文件方式 2
// params.addBodyParameter("uploadFile", new File("/sdcard/test.txt"));
Callback.Cancelable cancelable
       = x.http().get(params,
       /**
        * 1. callback的泛型:
        * callback参数默认支持的泛型类型参见{@link org.xutils.http.loader.LoaderFactory},
        * 例如: 指定泛型为File则可实现文件下载, 使用params.setSaveFilePath(path)指定文件保存的全路径.
        * 默认支持断点续传(采用了文件锁和尾端校验续传文件的一致性).
        * 其他常用类型可以自己在LoaderFactory中注册,
        * 也可以使用{@link org.xutils.http.annotation.HttpResponse}
        * 将注解HttpResponse加到自定义返回值类型上, 实现自定义ResponseParser接口来统一转换.
        * 如果返回值是json形式, 那么利用第三方的json工具将十分容易定义自己的ResponseParser.
        * 如示例代码{@link org.xutils.sample.http.BaiduResponse}, 可直接使用BaiduResponse作为
        * callback的泛型.
        *
        * 2. callback的组合:
        * 可以用基类或接口组合个种类的Callback, 见{@link org.xutils.common.Callback}.
        * 例如:
        * a. 组合使用CacheCallback将使请求检测缓存或将结果存入缓存(仅GET请求生效).
        * b. 组合使用PrepareCallback的prepare方法将为callback提供一次后台执行耗时任务的机会,
        * 然后将结果给onCache或onSuccess.
        * c. 组合使用ProgressCallback将提供进度回调.
        * ...(可参考{@link org.xutils.image.ImageLoader}
        * 或 示例代码中的 {@link org.xutils.sample.download.DownloadCallback})
        *
        * 3. 请求过程拦截或记录日志: 参考 {@link org.xutils.http.app.RequestTracker}
        *
        * 4. 请求Header获取: 参考 {@link org.xutils.http.app.RequestInterceptListener}
        *
        * 5. 其他(线程池, 超时, 重定向, 重试, 代理等): 参考 {@link org.xutils.http.RequestParams}
        *
        **/
       new Callback.CommonCallback() {
           @Override
           public void onSuccess(String result) {
               Toast.makeText(x.app(), result, Toast.LENGTH_LONG).show();
           }

           @Override
           public void onError(Throwable ex, boolean isOnCallback) {
               //Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show();
               if (ex instanceof HttpException) { // 网络错误
                   HttpException httpEx = (HttpException) ex;
                   int responseCode = httpEx.getCode();
                   String responseMsg = httpEx.getMessage();
                   String errorResult = httpEx.getResult();
                   // ...
               } else { // 其他错误
                   // ...
               }
               Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show();
           }

           @Override
           public void onCancelled(CancelledException cex) {
               Toast.makeText(x.app(), "cancelled", Toast.LENGTH_LONG).show();
           }

           @Override
           public void onFinished() {

           }
       });

// cancelable.cancel(); // 取消请求
```
#### 如果你只需要一个简单的版本:
```java
@Event(value = R.id.btn_test_baidu2)
private void onTestBaidu2Click(View view) {
    RequestParams params = new RequestParams("https://www.baidu.com/s");
    params.setSslSocketFactory(...); // 设置ssl
    params.addQueryStringParameter("wd", "xUtils");
    x.http().get(params, new Callback.CommonCallback() {
        @Override
        public void onSuccess(String result) {
            Toast.makeText(x.app(), result, Toast.LENGTH_LONG).show();
        }

        @Override
        public void onError(Throwable ex, boolean isOnCallback) {
            Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show();
        }

        @Override
        public void onCancelled(CancelledException cex) {
            Toast.makeText(x.app(), "cancelled", Toast.LENGTH_LONG).show();
        }

        @Override
        public void onFinished() {

        }
    });
}
````
#### 带有缓存的请求示例:
```java
BaiduParams params = new BaiduParams();
params.wd = "xUtils";
// 默认缓存存活时间, 单位:毫秒.(如果服务没有返回有效的max-age或Expires)
params.setCacheMaxAge(1000 * 60);
Callback.Cancelable cancelable
       // 使用CacheCallback, xUtils将为该请求缓存数据.
      = x.http().get(params, new Callback.CacheCallback() {

   private boolean hasError = false;
   private String result = null;

   @Override
   public boolean onCache(String result) {
      // 得到缓存数据, 缓存过期后不会进入这个方法.
      // 如果服务端没有返回过期时间, 参考params.setCacheMaxAge(maxAge)方法.
        //
        // * 客户端会根据服务端返回的 header 中 max-age 或 expires 来确定本地缓存是否给 onCache 方法.
        //   如果服务端没有返回 max-age 或 expires, 那么缓存将一直保存, 除非这里自己定义了返回false的
        //   逻辑, 那么xUtils将请求新数据, 来覆盖它.
        //
        // * 如果信任该缓存返回 true, 将不再请求网络;
        //   返回 false 继续请求网络, 但会在请求头中加上ETag, Last-Modified等信息,
        //   如果服务端返回304, 则表示数据没有更新, 不继续加载数据.
        //
        this.result = result;
        return false; // true: 信任缓存数据, 不在发起网络请求; false不信任缓存数据.
   }

   @Override
   public void onSuccess(String result) {
      // 注意: 如果服务返回304 或 onCache 选择了信任缓存, 这时result为null.
        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();
      if (ex instanceof HttpException) { // 网络错误
         HttpException httpEx = (HttpException) ex;
         int responseCode = httpEx.getCode();
         String responseMsg = httpEx.getMessage();
         String errorResult = httpEx.getResult();
         // ...
      } else { // 其他错误
         // ...
      }
   }

   @Override
   public void onCancelled(CancelledException cex) {
      Toast.makeText(x.app(), "cancelled", Toast.LENGTH_LONG).show();
   }

   @Override
   public void onFinished() {
      if (!hasError && result != null) {
         // 成功获取数据
         Toast.makeText(x.app(), result, Toast.LENGTH_LONG).show();
      }
   }
});
```

### 使用数据库(更多示例参考sample项目)
```java
Parent test = db.selector(Parent.class).where("id", "in", new int[]{1, 3, 6}).findFirst();
long count = db.selector(Parent.class).where("name", "LIKE", "w%").and("age", ">", 32).count();
List testList = db.selector(Parent.class).where("id", "between", new String[]{"1", "5"}).findAll();
```

### 绑定图片(更多示例参考sample项目)
```java
x.image().bind(imageView, url, imageOptions);

// assets file
x.image().bind(imageView, "assets://test.gif", imageOptions);

// local file
x.image().bind(imageView, new File("/sdcard/test.gif").toURI().toString(), imageOptions);
x.image().bind(imageView, "/sdcard/test.gif", imageOptions);
x.image().bind(imageView, "file:///sdcard/test.gif", imageOptions);
x.image().bind(imageView, "file:/sdcard/test.gif", imageOptions);

x.image().bind(imageView, url, imageOptions, new Callback.CommonCallback() {...});
x.image().loadDrawable(url, imageOptions, new Callback.CommonCallback() {...});
// 用来获取缓存文件
x.image().loadFile(url, imageOptions, new Callback.CommonCallback() {...});
```

----
### 关于作者
* Email: , 
* 有任何建议或者使用中遇到问题都可以给我发邮件, 你也可以加入QQ群:330445659(已满), 275967695, 257323060,
384426013, 176778777, 169852490, 261053948, 330108003, 技术交流,idea分享 *_*
加载中

评论(23)

lzxun
lzxun
非常不错,证在在使用,还解决多文件文件同时上传的问题
螺螺
螺螺
Android 企业级项目实战开发视频资料 加群:595642365 领取 群验证:01
1336724758
1336724758
为什么xutils官方没有不给xutils+加入httpDNS的实例呢
U
UTOPIA111
xutils3.0 显示GIF的时候,感觉比真实的Gif要满呢?这个是需要设置什么参数吗?
Jun丶豪
Jun丶豪
用过,挺好的, #xUtils#
陶月和
陶月和
噢噢噢 #xUtils#
维斯-第七宇宙
维斯-第七宇宙
我最怕产品找我说话了 #xUtils#
残夜黯殇
xutils3.0怎么设置超时时间啊? #xUtils#
孤星破军
孤星破军
大神们 我用xUtils上传2个bitmap文件,服务器总是返回500错误,是什么原因啊有人遇到过吗,我是初学者 #xUtils#
孤星破军
孤星破军
怎么没有找到jar包呢 我用的是androidstudio #xUtils#

xUtils 3.5.0发布 - Android 工具库

xUtils3简介 * xUtils 包含了orm, http(s), image, view注解, 但依然很轻量级(246K), 并且特性强大, 方便扩展: - `稳定的基石`: `AbsTask`和统一的回调接口`Callback`, 任何异常, 即使你的回...

2017/04/05 05:33

xUtils 3.1.22 更新 修复API 14之前的系统偶发EOF问题

感谢关注xUtils的网友最近一段时间给予的热心反馈,最近优化和处理了很多大家反馈的细节问题. 近期主要更新内容: * 修复Android4.4之前HttpUrlConnection偶发的EOFException问题 * 优化Objec...

2015/12/25 12:24

xUtils 3.0 发布 api重构 数据库操作性能大幅提升

感谢关注xUtils的网友最近一段时间给予的热心反馈,最近工作比较忙, 很多大家发来的邮件都没有及时回复, 稍后我会回复大家。 3.0是一次彻底的重构, api发生了很大变化, 但是仍然保持着xUtil...

2015/11/05 14:01

xUtils 2.5.4 发布,重构事件注入模型.

感谢关注xUtils的网友最近一段时间给予的热心反馈,最近工作比较忙, 很多大家发来的邮件都没有及时回复, 稍后我会回复大家。 最近主要更新内容: * 使用动态代理重构事件注入模型, 使用方式没...

2014/04/19 14:31

xUtils 2.4.7 发布, 修复上传多文件到php的bug

感谢关注xUtils的网友最近一段时间给予的热心反馈,最近工作比较忙, 很多大家发来的邮件都没有及时回复, 稍后我会回复大家。 最近主要更新内容: * 修复BitmapUtils下载错误文件后,一直使用错...

2014/02/28 10:37

xUtils 2.4.2 发布,细节优化

感谢关注xUtils的网友最近一段时间给予的热心反馈,自从2.3.1里程碑杯发布功能已非常稳定。 最近主要更新内容: * bitmap模块取消清除缓存时displayConfig参数 。 * 更新DbUpgradeListener,更...

2013/12/10 14:18

xUtils 2.3.6 发布-细节优化

感谢关注xUtils的网友最近一段时间给予的热心反馈,自从2.3.1里程碑杯发布已经功能已非常稳定。最近一周主要进行了一些细节上的优化。 2.3.6主要更新内容: * BitmapLoadCallBack添加onLoadi...

2013/12/01 15:14

xUtils 2.3.1 发布-里程碑版本,更加稳定...

感谢关注xUitls的网友最近一段时间给予的热心反馈,xUtils近期做了很多细节优化之后,功能和api已经稳定。 希望使用1.*.*等早期版本的用户升级至最新的版本, 以使后期继续升级更加方便, 早期...

2013/11/25 10:55

xUtils 2.2.4 发布-细节优化,加速bitmap加载...

感谢关注xUitls的网友最近一段时间给予的热心反馈,xUtils近期做了很多细节优化之后,功能和api已经稳定。 希望使用1.*.*等早期版本的用户升级至最新的版本, 以使后期继续升级更加方便, 早期...

2013/11/20 14:07

xUtils 2.1.3 发布-细节优化,更多示例代码...

感谢关注xUitls的网友最近一段时间给予的热心反馈,xUtils近期做了很多细节优化之后,功能和api已经稳定。 希望使用1.*.*等早期版本的用户升级至最新的版本, 以使后期继续升级更加方便, 早期...

2013/11/12 13:32

没有更多内容

加载失败,请刷新页面

6
回答
xUtils是否支持多文件上传

我想请问一下xutils是否支持多文件上传,这个有没做队列上传处理。能告诉我具体如何操作吗?

2013/12/08 11:27
1
回答
为什么有时候有个方形背景,有时候显示正常的圆形

这个人的头像,有时候会有方形的背景(图片左上角位置),即使多刷新几遍,还是改不回来,然后退出,重新进去,又回复到正常的圆形头像,方形背景消失,请问这是为什...

2015/05/26 12:56
5
回答
xutils3中x.http().getSync同步访问网络的方法参数如何设置??

需要用到utils3的同步访问网络的方法,发现参数不知道怎样设置,试了很多次都失败了,求大神解答 <T> T getSync(RequestParams ...

2016/05/17 20:05
2
回答
android studio module中不能使用xutil/afinal/butterknife等工具?

一个项目分割为若干module部分,比如item、order、cart 有一个主项目,apply plugin: 'com.android.applica...

2015/05/09 15:33
3
回答
Xutils下载,断点续传功能,显示进度错乱

大家好,我正在使用Xutils进行项目中的断点续传,作者在文档中写到如果支持断点续传必须服务器端支持 RANGE,在运行过程中如果不断点正常下载,但是只要...

2014/11/18 12:18
1
回答
android xutils

@Jack_1900 你好,想跟你请教个问题:你好请问下,xutils怎么添加自己的缓存

2015/02/03 15:37
2
回答
android 使用xUtils上传大文件时网络连接中断 是怎么回事?

我在使用android 的开源框架xUtils时 上传一个30M大小的视频文件的时候 上传过程中会网络连接中断 xUtils的版本是2.6.14版本 这是...

2016/05/31 11:38
4
回答
xutils下载文件的路径含有中文,走error,怎么解决?

用get请求下载音乐,路径是 String mFileName = "http://69.165.75.47/光辉岁月.mp3"; 05-11 04:21...

2016/05/11 16:32
3
回答
如何在servlet里面接收到Android端传过来的Json数据(利用HttpUtils框架传的)

最近在做一个Android——Web两边关联的点菜APP,在Android端利用httpUtils上传菜单的时候(已经组织为Json数据形式,检查内容正确...

2016/05/11 15:55
3
回答
使用xutils里面的HttpUtils时候如何在servlet中向其传回一个值???纠结好久!
依风听雨风之魂 的回答 2016/04/23 19:03
最佳答案
引用来自“依风听雨风之魂”的评论这很明显是servlet的问题啊,你要在servlet中输出值,HttpUtils才能接收到啊 response.setCharacterEncoding("UTF-8"); response.setContentType("application/json; ...

没有更多内容

加载失败,请刷新页面

xUtils框架的介绍

介绍个我这段时间研究的一个基于快速开发的Android框架——xUtils。有了它,能够极大的简化代码,提高代码的易读性。

2013/10/31 22:39
8.9K
8
Android快速开发工具库xUtils 1.0发布,针对混淆优化,orm,view注解......

xUtils简介 xUtils 包含了很多实用的android工具,让你的开发过程更高效。 xUtils 源于Afinal框架,对Afinal进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持,拥有更加...

2013/08/23 16:27
1K
0
xUtils介绍 -- DbUtils、ViewUtils、HttpUtils、BitmapUtils

转载注明出处:https://github.com/wyouflf/xUtils xUtils简介 xUtils 包含了很多实用的android工具。 xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多...

2014/09/12 11:48
271
0
Android 最火的快速开发框架XUtils

最近搜了一些框架供初学者学习,比较了一下XUtils是目前git上比较活跃 功能比较完善的一个框架,是基于afinal开发的,比afinal稳定性提高了不少,下面是介绍: 鉴于大家的热情,我又写了一篇...

2014/10/23 13:37
754
1
  xUtils框架的介绍

微信账号申请终于通过了,这是我们第一次Android干货分享。想来是第一次,要对得起“干货”二字。今天我要为大家推荐的是一个Android基于快速开发的一个框架——xUtils,它是在aFinal基础上进...

2015/07/21 17:32
43
0
xUtils - android工具库,大量更新:bug修复,缓存优化,GET请求加入lru缓存。

感谢大家最近一段时间对xUtils的关注,和给我bug反馈,这也使我在xUtils的开发上更有热情。 昨天晚上熬夜到5点多,完成了缓存模块的整理和结构优化,今天在此基础上有完成了给http模块添加G...

2013/08/01 18:24
5.9K
3
【报错】retry error curr request is null

retry error curr request is null

2014/12/01 16:40
841
0
xUtils - 更新:链式表达查询,更具可读性android数据库查询。

最近有网友留言, 问xUitls会不会像其他几个同类库一样支持不是很好,有问题没地方反馈,或者反馈完就没音讯了。 我在这里郑重的告诉大家绝对不会,xUtils的支持绝对是最快的,只要时bug问题...

2013/08/11 23:54
3.5K
2
xUtils简介

xUtils 包含了很多实用的android工具。 xUtils 最初源于Afinal框架,进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支...

2014/03/23 14:29
1K
0
android快速开发框架xUtils

android快速开发框架xUtils

2014/12/22 21:55
71
0

没有更多内容

加载失败,请刷新页面

返回顶部
顶部