xUtils简介
Github上比较火的一个安卓快速开发库.
下载地址
xUtils 包含了很多实用的android工具。
xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响…
xUitls 最低兼容android 2.2 (api level 8)
注解开发方式–ViewUtils
完全注解方式就可以进行UI绑定和事件绑定。
无需findViewById和setClickListener等。
重要对象
注解 |
对类 方法 变量 以 添加注解以后由注解处理器处理该注解 开发效率高 |
@ViewInject |
对控件变量设置指定id实例代替findViewById |
@OnClick |
对控件添加事件代替setOn…Listener支持常见事件 |
@ResInject |
对数据变量设置值代替getResource().getString(R.string.app_name) |
ViewsUtils |
使注解生效Activity– ViewsUtils.inject(this),Fragment –ViewUtils.inject(this,view) |
核心代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| public class FirstMainActivity extends Activity {
@ViewInject(R.id.mybutton)
Button mybutton;
@OnClick(R.id.mybutton)
public void myButonClick(View view) {
Toast.makeText(getBaseContext(), "点了我", 0).show();
}
@ResInject(id = R.string.app_name, type = ResType.String)
String text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewUtils.inject(this);
System.out.println(mybutton);
mybutton.setText(text);
}
}
|
网络开发工具–HttpUtils

重要对象
HttpUtils |
发送请求的对象get/post/download/强大的地方:支持文件下载中断后,在原来位置重新下载 |
RequestCallBack |
响应数据的接收类;通过对应方法接收返回数据;onSuccess成功, onFailure失败。。。 |
get
配置权限
创建HttpUtils实例
发送请求
接收数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| @OnClick(R.id.get)
public void get(View view) {
try {
String url = "https://www.baidu.com/";
HttpUtils http = new HttpUtils() ;
http.send(HttpMethod.GET, url, new RequestCallBack<String>() {
@Override
public void onFailure(HttpException e, String msg) {
}
@Override
public void onSuccess(ResponseInfo<String> result) {
resultText.setText(result.result);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
|
post
登录接口
/LoginServlet 参数 username password
RequestParams
请求参数的表单,内部含Map,可以支持编码设定 例:UTF-8
提交表单
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| HttpUtils http = new HttpUtils();
RequestParams form=new RequestParams("UTF-8");
form.addBodyParameter("username", "wengweng");
form.addBodyParameter("pwd", "123");
http.send(HttpMethod.POST, url,form, new RequestCallBack<String>()
|
文件上传
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| /UploadFileServlet
formfile文件接收字段
RequestParams form = new RequestParams("UTF-8");
form.addBodyParameter("formfile", new File("mnt/sdcard/temp.apk"));
http.send(HttpMethod.POST, url, form, new RequestCallBack<String>()
注意事项:可以重写onLoading方法提高用户体验
@Override
public void onLoading(long total, long current, boolean isUploading) {
super.onLoading(total, current, isUploading);
String currValue = Formatter.formatFileSize(getBaseContext(), current);
String totalValue = Formatter.formatFileSize(getBaseContext(), total);
resultText.setText(currValue + "/" + totalValue);
}
|
download
注意事项建议重写onLoading方法获取下载进度
配置权限
创建HttpUtils对象
打开下载方法
保存下载控制器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
| private HttpHandler<File> handler;
@OnClick(R.id.download)
public void download(View view) {
try {
HttpUtils http = new HttpUtils();
String url = "http://192.168.1.102:8080/web/WiFiKeyPC.zip";
String path = "mnt/sdcard/WiFiKeyPC.zip";
handler = http.download(url, path, true, false, new RequestCallBack<File>() {
@Override
public void onLoading(long total, long current, boolean isUploading) {
super.onLoading(total, current, isUploading);
String currValue = Formatter.formatFileSize(getBaseContext(), current);
String totalValue = Formatter.formatFileSize(getBaseContext(), total);
resultText.setText(currValue + "/" + totalValue);
}
@Override
public void onSuccess(ResponseInfo<File> responseInfo) {
resultText.setText("下载成功保存在" + responseInfo.result.getAbsolutePath());
}
@Override
public void onFailure(HttpException error, String msg) {
resultText.setText("下载失败"+msg);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
@OnClick(R.id.pause)
public void pause(View view) {
if (!handler.isCancelled()) {
Toast.makeText(getBaseContext(), "暂停下载", 0).show();
handler.cancel();
}
}
|
网络图片异步加载工具–BitmapUtils
重要对象
BitmapUtils
图片加载工具
加载 网络 本地 asset目录 的图片

- 创建BitmapUtils对象
- 给指定ImageView控件加载图片
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| // String imageUrl =
// "http://images.51cto.com/files/uploadimg/20130322/1724296.png";
// String imageUrl = "assets/tt.jpg";
String imageUrl = "/mnt/sdcard/tt.jpg";
// ① 创建BitmapUtils对象
// BitmapUtils bitmapUtils=new BitmapUtils(上下文, 保存路径);
BitmapUtils bitmapUtils = new BitmapUtils(this, "mnt/sdcard/");
// ② 给指定ImageView控件加载图片
// bitmapUtils.display(控件, 资源地址,载入参数获取对象)
//注意事项1.display需要指定 显示的ImageView控件 2.通过onLoadCompleted方法获取Bitmap设置给ImageView
//3. sd卡必须以 /开头 asset 不要/开头
bitmapUtils.display(image, imageUrl, new BitmapLoadCallBack<View>() {
@Override
public void onLoadCompleted(View container, String uri, Bitmap bitmap, BitmapDisplayConfig config, BitmapLoadFrom from) {
image.setImageBitmap(bitmap);
}
@Override
public void onLoadFailed(View container, String uri, Drawable drawable) {
}
});
|
ORM数据库工具类DbUtils
ORM即对象关系映射(Object-Relational Mapping),在对象与表之间建议对应关系,将sql封装起来,封装了sql的编写,开发者大量减少sql编写,感觉像在操作集合

重要对象
Dbutils
核心对象。支持对象的CRUD
增删改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| @OnClick(R.id.insert)
public void insert(View view) {
// ① 创建DbUtils对象
DbUtils db = DbUtils.create(this);
for (int i = 0; i < 20; i++) {
User u = new User();
u.id = i;
u.name = "测试"+i;
u.age = 12;
u.email = "jiankan@qq.cn";
// ② 保存多条记录
try {
db.save(u);
} catch (DbException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@OnClick(R.id.delete)
public void delete(View view) {
// ① 创建DbUtils对象
DbUtils db = DbUtils.create(this);
try {
db.deleteById(User.class, "1");
} catch (DbException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@OnClick(R.id.update)
public void update(View view) {
// 先查找出一条记录 修改值 后给update并指明修改属性
// ① 创建DbUtils对象
DbUtils db = DbUtils.create(this);
try {
User u = db.findById(User.class, "0");
u.name = "曹操";
db.update(u, "name");
} catch (DbException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
|
查询与高级查询
Selector |
数据筛选对象,具体负责条件语句,例WHERE id<54 AND (age>20 OR age<30) ORDER BY id LIMIT pageSize OFFSET pageOffs |
WhereBuilder |
where拼接条件 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| @OnClick(R.id.query)
public void query(View view) {
// ① 创建DbUtils对象
DbUtils db = DbUtils.create(this);
try {
// 全查
List<User> users = db.findAll(User.class);// 查询所有
println(users);
// User u = db.findFirst(条件对象);
// User u = db.findFirst(Selector.from(User.class).where("name",
// "=", "曹操")); //条件查询
// User u = db.findFirst(Selector.from(User.class).where("name",
// "!=", null));//非空查询
// User u = db.findFirst(Selector.from(User.class).where("name",
// "=", null));// 空查询
// System.out.println(u);
} catch (DbException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//高级查询
@OnClick(R.id.query2)
public void query2(View view) {
// ① 创建DbUtils对象
DbUtils db = DbUtils.create(this);
try {
// 全查
List<User> users = db.findAll(User.class);// 查询所有
println(users);
System.out.println("Selector高级查询");
// 条件查询Selector
List<User> users2 = db.findAll(Selector.from(User.class)//
.where(WhereBuilder.b("id", "<", "10"))// where条
.or(WhereBuilder.b("id", ">", "15")// or
).orderBy("id")// orderby
.limit(3)// limit
.offset(3)// offset 返回值开始位置 下标0代表第一条
);
println(users2);
} catch (DbException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
|
混淆时注意事项
添加Android默认混淆配置${sdk.dir}/tools/proguard/proguard-android.txt
不要混淆xUtils中的注解类型,添加混淆配置:-keep class * extends java.lang.annotation.Annotation { *; }
对使用DbUtils模块持久化的实体类不要混淆,或者注解所有表和列名称@Table(name=”xxx”),@Id(column=”xxx”),@Column(column=”xxx”),@Foreign(column=”xxx”,foreign=”xxx”);