![](https://img.haomeiwen.com/i25021128/fcc7c4be08d9a528.png)
在维护一些年代久远的Android
项目的时候,我们可能会遇到xUtils3
网络请求框架。对于一些比较后面进入Android
开发行业的小伙伴可能比较陌生,分享一下我知道的知识。
xUtils3
xUtils
包含了orm, http(s), image, view注解, 但依然很轻量级(251K), 并且特性强大, 方便扩展。有着非常强大的特性:
- orm: 高效稳定的orm工具, 使得http接口实现时更方便的支持cookie和缓存.
- 灵活的, 类似linq表达式的接口.
- 和greenDao一致的性能.
- http(s): 基于UrlConnection, Android4.4以后底层为okHttp实现.
-
请求协议支持11种谓词: GET,POST,PUT,PATCH,HEAD,MOVE,COPY,DELETE,OPTIONS,TRACE,CONNECT
-
支持超大文件(超过2G)上传
-
支持断点下载(如果服务端支持Range参数,客户端自动处理断点下载)
-
支持cookie(实现了domain, path, expiry等特性)
-
支持缓存(实现了Cache-Control, Last-Modified, ETag等特性, 缓存内容过多时使用过期时间+LRU双重机制清理)
-
支持异步和同步(可结合RxJava使用)调用
- image: 有了http(s)及其下载缓存的支持, image模块的实现相当的简洁.
-
支持内存缓存, 磁盘缓存(缩略图和原图), 并且支持回收被view持有, 但被MemCache移除的图片, 减少页面回退时的闪烁.
-
支持在ListView滑动时, 自动停止被回收复用的item对应的下载任务(再次下载时断点续传)
-
支持webp, gif(部分比较老的系统只展示静态图)
-
支持圆角, 圆形, 方形等裁剪, 支持自动旋转...
- view注解: view注解模块仅仅400多行代码却灵活的支持了各种View注入和事件绑定.
-
事件注解支持且不受混淆影响...
-
支持绑定拥有多个方法的listener
xUtils3的引入
implementation 'org.xutils:xutils:3.9.0'
截止我发布博客,目前开源库的版本是3.9.0
.最新版本请查看官方的wiki
xUtils3的混淆配置
-keepattributes Signature,*Annotation*
-keep public class org.xutils.** {
public protected *;
}
-keep public interface org.xutils.** {
public protected *;
}
-keepclassmembers class * extends org.xutils.** {
public protected *;
}
-keepclassmembers @org.xutils.db.annotation.* class * {*;}
-keepclassmembers @org.xutils.http.annotation.* class * {*;}
-keepclassmembers class * {
@org.xutils.view.annotation.Event <methods>;
}
xUtils3的使用
权限配置:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!-- 可选 -->
初始化:
// 在application的onCreate中初始化
@Override
public void onCreate() {
super.onCreate();
x.Ext.init(this);
x.Ext.setDebug(BuildConfig.DEBUG); // 是否输出debug日志, 开启debug会影响性能.
...
}
使用@Event事件注解:
/**
* 1. 方法必须私有限定,
* 2. 方法参数形式必须和type对应的Listener接口一致.
* 3. 注解参数value支持数组: value={id1, id2, id3}
* 4. 其它参数说明见{@link org.xutils.event.annotation.Event}类的说明.
**/
@Event(value = R.id.btn_test1,
type = View.OnClickListener.class/*可选参数, 默认是View.OnClickListener.class*/)
private void onTest1Click(View view) {
...
}
使用数据库:
Parent test = db.selector(Parent.class)
.where("id", "in", new int[]{1, 3, 6})
.or("age", "<", 29)
.findFirst();
long count = db.selector(Parent.class)
.where("name", "LIKE", "w%")
.and("age", ">", 32)
.count();
List<Parent> testList = db.selector(Parent.class)
.where("id", "between", new String[]{"1", "5"})
.findAll();
List<DbModel> list = db.selector(Child.class)
.where("age", "<", 18)
.groupBy("parentId")
.having(WhereBuilder.b("COUNT(parentId)", ">", 1))
.select("parentId, COUNT(parentId) as childNum")
.findAll();
简单使用网络请求:
@Event(value = R.id.btn_test2)
private void onTest2Click(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<String>() {
@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() {
}
});
}
这个开源库第一次接触的时候发现功能非常的齐全,但是目前来说主流的网络请求框架不是它,所以相对来说比较少见。我之前维护过两个使用xUtils3
的项目,不熟悉的话可能要看一下文档深入了解一下。
网友评论