xUtils3 其功能不得不说,简化了很多的开发步骤,可以说是非常好的开发工具,但是苦于没有完整的使用手册,下面是使用中的一些总结,不断完善。
xUtils 版本 | 3.3.36 |
jar包下载地址 | |
GitHub项目地址 |
使用前配置
1 <uses-permission android:name="android.permission.INTERNET" /> 2 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
导入文件
方法1:导入jar包文件;
方法2:在gradle中添加依赖:
dependencies { compile 'org.xutils:xutils:3.3.44' }
1. xUtils中的IOC框架
使用xUtils的第一步就是先创建自己的Application类,在MyApplication中初始化xUtils,代码如下:
1 public class MyApplication extends Application { 2 @Override 3 public void onCreate() { 4 super.onCreate(); 5 x.Ext.init(this); //xUtils初始化 6 } 7 }
在AndroidManifest.xml的application标签中添加如下代码:
1 android:name=".MyApplication"
这样初始化就算完成了。
例:下面使用IOC框架的代码如下:
1 import org.xutils.view.annotation.ContentView; 2 import org.xutils.view.annotation.Event; 3 import org.xutils.view.annotation.ViewInject; 4 import org.xutils.x; 5 // 获取Activity布局 6 @ContentView(R.layout.activity_main) 7 public class MainActivity extends Activity { 8 // 获取控件ID 9 @ViewInject(R.id.mybut) 10 private Button mybut; 11 12 @Override 13 protected void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 x.view().inject(this); // 初始化x.view(), 否则ID获取失败 16 } 17 18 /** 添加控件监听事件 */ 19 @Event(value = {R.id.mybut, R.id.myradio},type = View.OnClickListener.class) 20 private void onButtonClick(View v){ 21 switch (v.getId()) { 22 case R.id.mybut: 23 Toast.makeText(this,"我是xUtils的IOC功能", Toast.LENGTH_SHORT).show(); 24 break; 25 case R.id.myradio: 26 break; 27 } 28 } 29 }
注释:监听事件中,@Event, value后面是 Array,当多个ID时{R.id.btn1, R.id.btn2, R.id.btn3, ···}; 当只有一个ID时可直接写 value=R.id.btn。
当有多个ID时,要保证后面事件的类型(type)要是一致的,否则要在不同的方法中实现。
另:点击事件方法名一定要包含onClick或者onEven。
2. 网络请求
RequestParams 参数:
RequestParams params = new RequestParams(url);
.addQueryStringParamter("wd", "xUtils"
); // 适用于GET请求方式;类似于字符串拼接 http://xxx/x?wd=xUtils。
.addBodyParameter("wd", "xUtils"
); // 适用于POST请求方式;添加到Body体的参数。
2.1 GET/POST请求
get和post请求并无太大区别,主要区别在于参数的添加方法上。
GET请求 | POST请求 | |
请求参数添加: | .addQueryStringParamter("wd", "xUtils" ); |
.addBodyParameter("wd", "xUtils" ); |
请求的方法(带缓冲): | x.http().get(params, new Callback.CommonCallback<String>() { }); | x.http().post(params, new Callback.CommonCallback<String>() { }); |
请求的方法(带缓冲): | x.http().get(params, new Callback.CacheCallback<String>() { }); | x.http().post(params, new Callback.CacheCallback<String>() { }); |
2.1.1 无缓存请求(以post为例)
1 RequestParams params = new RequestParams("http://xxx.com/xx"); 2 x.http().post(params, new Callback.CommonCallback<String>() { 3 @Override 4 public void onSuccess(String result) { 5 // 请求成功后,返回结果 6 } 7 @Override 8 public void onError(Throwable ex, boolean isOnCallback) { 9 // 请求失败后返回结果 10 if (!isNetworkConnections() || ex instanceof HttpException) { 11 // 网络错误 12 } else { 13 // 其他请求错误 14 } 15 @Override 16 public void onCancelled(Callback.CancelledException cex) { 17 // 中断请求 18 } 19 @Override 20 public void onFinished() { 21 // 请求结束(必调用) 22 } 23 } 24 ); 25 /** 26 * @return 网络是否连接 true:有网络,false:无网络 27 */ 28 private boolean isNetworkConnections() { 29 ConnectivityManager con = (ConnectivityManager) x.app().getSystemService(Context.CONNECTIVITY_SERVICE); 30 boolean wifi = con.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected(); 31 boolean internet = con.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnected(); 32 return (wifi || internet); 33 }
2.1.2 有缓存请求(以POST为例)
1 RequestParams params = new RequestParams("http://xxx.com/xx"); 2 x.http().post(params, new Callback.CacheCallback<String>() { 3 @Override 4 public void onSuccess(String result) { 5 // 请求成功后,返回结果 6 } 7 @Override 8 public boolean onCache(String result) { 9 // 此方法为本地加载回调方法,本地没有数据则不会调用此方法 10 // @param result 缓存中得到的数据 11 // @return true 如果缓存中有数据就不再进行网络请求 12 // false 得到缓存数据后仍进行网络请求 13 return ture; 14 } 15 @Override 16 public void onError(Throwable ex, boolean isOnCallback) { 17 // 请求失败后返回结果 18 if (!isNetworkConnections() || ex instanceof HttpException) { 19 // 网络错误 20 } else { 21 // 其他请求错误 22 } 23 @Override 24 public void onCancelled(Callback.CancelledException cex) { 25 // 中断请求 26 } 27 @Override 28 public void onFinished() { 29 // 请求结束(必调用) 30 } 31 } 32 );
3. 图片加载
3.1 普通图片加载
最简单的加载方式:
x.image().bind(image, "http://pic6.nipic.com/20100418/4581549_084724004690_2.jpg");
当然我们也可以设置一些属性:
1 ImageOptions imageOptions = new ImageOptions.Builder() 2 .setSize(120, 120) 3 .setRadius(DensityUtil.dip2px(5)) 4 .setCrop(true) 5 .setImageScaleType(ImageView.ScaleType.CENTER_CROP) 6 .setLoadingDrawableId(R.mipmap.ic_launcher) 7 .setFailureDrawableId(R.mipmap.ic_launcher) 8 .build(); 9 x.image().bind(image, "http://pic6.nipic.com/20100418/4581549_084724004690_2.jpg",imageOptions);
3.2 圆形图片加载
ImageOptions options = new ImageOptions.Builder() .setLoadingDrawableId(R.mipmap.ic_launcher) .setFailureDrawableId(R.mipmap.ic_launcher) .setUseMemCache(true) .setCircular(true) // 设置成圆形图片 .setFadeIn(true) //淡入效果 .setImageScaleType(ImageView.ScaleType.FIT_CENTER) .build();
注:圆形图片加载options的设置对本地图片无效。
3.3 GIF图片加载
ImageOptions options = new ImageOptions.Builder() .setLoadingDrawableId(R.mipmap.ic_launcher) .setFailureDrawableId(R.mipmap.ic_launcher) .setUseMemCache(true) .setIgnoreGif(true) // 允许加载GIF图片 .setFadeIn(true) //淡入效果 .setImageScaleType(ImageView.ScaleType.FIT_CENTER) .build();
3.4 ImageOptions属性
.setFadeIn(true); //淡入效果
.setCircular(true); //设置图片显示为圆形
.setSquare(true); //设置图片显示为正方形
.setCrop(true).setSize(200,200); //设置大小
.setAnimation(animation); //设置动画
.setFailureDrawable(Drawable failureDrawable); //设置加载失败的动画
.setFailureDrawableId(int failureDrawable); //以资源id设置加载失败的动画
.setLoadingDrawable(Drawable loadingDrawable); //设置加载中的动画
.setLoadingDrawableId(int loadingDrawable); //以资源id设置加载中的动画
.setIgnoreGif(false); //忽略Gif图片
.setParamsBuilder(ParamsBuilder paramsBuilder); //在网络请求中添加一些参数
.setRaduis(int raduis); //设置拐角弧度
.setUseMemCache(true); //设置使用MemCache,默认true
4. 相关资料
☞ Android xUtils3.0使用手册(二) - 数据库操作
Android xUtils3.0使用手册(二) - 数据库操作
步骤:
(1). 创建数据表;
(2). DaoConfig 获取数据库的配置信息;
(3). 获取数据库实例: x.getDb(daoConfig);
(4). 数据库的增删改查。
1. 创建数据表
在这里要强调的是,数据库里面表的创建的时间,只有在你对数据库里面的操作涉及到这张表的操作时,会先判断当前的表是否存在,如果不存在,才会创建一张表,如果存在,才会进行相应的CRUD操作。
1 @Table(name = "person") 2 public class person { 3 @Column(name = "ID", isId = true, autoGen = true) 4 public int id; 5 @Column(name = "NAME") 6 public String name; // 姓名 7 @Column(name = "AGE") 8 public int age; // 年龄 9 @Column(name = "SEX") 10 public String sex; // 性别 11
12 @Override
13 public String toString() { 14 return "person [id=" + id + ", name=" + name + ", age=" + age + ", sex=" + sex + "]"; 15 }
16 }
上表中包含了db相关注解:
1 @Check check约束 2 @Column 列名 3 @Finder 一对多、多对一、多对多关系(见sample的Parent、Child中的使用) 4 @Foreign 外键 5 @Id 主键,当为int类型时,默认自增。 非自增时,需要设置id的值 6 @NoAutoIncrement 不自增 7 @NotNull 不为空 8 @Table 表名 9 @Transient 不写入数据库表结构 10 @Unique 唯一约束
注解属性
name (String) : 表名称 isId (boolean) : 是否为主键 autoGen (boolean) : 是否自增(默认: false) proprety (String) : 是否为空(默认: NOT NULL)
2. DaoConfig 获取数据库的配置信息
1 //本地数据的初始化 2 DbManager.DaoConfig daoConfig = new DbManager.DaoConfig() 3 .setDbName("my_db.db") //设置数据库名 4 .setDbVersion(1) //设置数据库版本,每次启动应用时将会检查该版本号, 5 // 发现数据库版本低于这里设置的值将进行数据库升级并触发DbUpgradeListener 6 .setAllowTransaction(true) //设置是否开启事务,默认为false关闭事务 7 .setTableCreateListener(new DbManager.TableCreateListener() { 8 @Override 9 public void onTableCreated(DbManager dbManager, TableEntity<?> tableEntity) { 10 } 11 }) 12 .setDbOpenListener(new DbManager.DbOpenListener() { 13 @Override 14 public void onDbOpened(DbManager db) { 15 // 开启WAL, 对写入加速提升巨大 16 db.getDatabase().enableWriteAheadLogging(); 17 } 18 }) 19 // 设置数据库创建时的Listener 20 .setDbUpgradeListener(new DbManager.DbUpgradeListener() { 21 @Override 22 public void onUpgrade(DbManager db, int oldVersion, int newVersion) { 23 // TODO: ... 24 // db.addColumn(...); 25 // db.dropTable(...); 26 // ... 27 // or 28 // db.dropDb(); 29 } 30 }); //设置数据库升级时的Listener,这里可以执行相关数据库表的相关修改,比如alter语句增加字段等 31 // .setDbDir(null);//设置数据库.db文件存放的目录,默认为包名下databases目录下 32 33 DBManager db = x.getDb(daoConfig);
3. 获取数据库实例
DbManager db = x.getDb(daoConfig);
4. 表 操作
通过DbManager这类我们可以做如下操作:
.getDaoConfig // 获取数据库的配置信息 .getDatabase // 获取数据库实例 .replace // 只有存在唯一索引时才有用 (慎重) .dropTable // 删除表 .addColumn // 添加一列 .dropDb // 删除数据库
5. 增 操作
1 try { 2 List<person> list = new ArrayList<person>(); 3 // ... 加载数据 4 5 db.save(list); // 保存实体类或者实体类的List到数据库 6 db.saveOrUpdate(list); // 保存或更新实体类或者实体类的List到数据库,根据id对应的数据是否存在 7 db.saveBindingId(list); // 保存实体类或实体类的List到数据库,如果该类型的id是自动生成的,则保存完后会给id赋值 8 } catch (DbException e) { 9 }
6. 删 操作
1 try { 2 db.delete(person.class);//该方法是删除表中的全部数据 3 db.deleteById(person.class, 12);//该方法主要是根据表的主键(id)进行单条记录的删除 4 db.delete(person.class, WhereBuilder.b("age", ">", "20"));//根据where语句的条件进行删除操作 5 List<person> findAll = db.selector(person.class).expr("age > 20").findAll(); 6 db.delete(findAll);//根据实体bean进行对表里面的一条或多条数据进行删除 7 } catch (DbException e) { 8 }
7. 改 操作
1 // 第一种 2 try { 3 List<Person> findAll = db.findAll(Person.class); 4 for (Person person : findAll) { 5 person.setAge(10); 6 } 7 db.update(findAll, "age"); //可以使对象、集合 8 } catch (DbException e) { 9 } 10 // 第二种 11 try { 12 PersonTable person = db.findById(Person.class, 1); 13 person.setAge(25); 14 db.update(person, "age"); 15 } catch(DbException e){ 16 }
8. 查 操作
1 try { 2 db.findById(person.class, 1);//通过主键的值来进行查找表里面的数据 3 db.findFirst(person.class);//返回当前表里面的第一条数据 4 List<person> findAll = db.findAll(person.class);//返回当前表里面的所有数据 5 db.findDbModelAll(new SqlInfo("select * from person where age > 25")); 6 DbModel model = db.findDbModelFirst(new SqlInfo("select * from person where age > 25")); 7 model.getString("age");//model相当于游标 8 List<person> findAll2 = db.selector(person.class).expr("age >10").findAll();//主要是用来进行一些特定条件的查找 9 } catch (DbException e) { 10 }
9. 相关资料
四、网络请求
由于Android6.0版本之后将HttpClient替换为UrlConnection,所以修改老项目的时候一定要注意。
这里我们简单封装一下, 请求参数通过map传过来,然后通过回调返回请求结果。
/**
* @author nelson
*/
public class c {
private static final String BASE_URL = "http://10.168.11.11/";
public static void get(String url, Map<String, Object> parms, final GetDataCallback callback) {
RequestParams params = new RequestParams(GetDataTask.BASE_URL + url);
if(parms!=null){
for (String key : parms.keySet()) {
params.addParameter(key, parms.get(key));
}
}
x.http().get(params, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
callback.success(result);
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
callback.failed();
}
@Override
public void onCancelled(CancelledException cex) {}
@Override
public void onFinished() {}
});
}
public static void post(String url, Map<String, Object> parms, final GetDataCallback callback) {
RequestParams params = new RequestParams(GetDataTask.BASE_URL + url);
if(parms!=null){
for (String key : parms.keySet()) {
params.addParameter(key, parms.get(key));
}
}
x.http().post(params, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
if(callback!=null){
callback.success(result);
}
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
if(callback!=null){
callback.failed();
}
}
@Override
public void onCancelled(CancelledException cex) {}
@Override
public void onFinished() {}
});
}
/**上传文件*/
public static void uplodFile(List<String> path, Map<String, Object> map, final GetDataCallback callback) {
RequestParams params =