Android全能开源项目xUtils3开发教程、简单封装
Android全能开源项目xUtils3开发教程、简单封装
一、简介
xUtils是一个比较全能的开源项目了, 包含了orm, http(s), image, view注解, 但依然很轻量级(246K), 并且特性强大, 方便扩展。这是xUtils3 的 github地址https://github.com/wyouflf/xUtils3
xUtils3 的一些特性
- xUtils支持超大文件(超过2G)上传,更全面的http请求协议支持(11种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响;
- xUtils3变化较多所以建立了新的项目不在旧版(github.com/wyouflf/xUtils)上继续维护, 相对于旧版本:
(1)HTTP实现替换HttpClient为UrlConnection, 自动解析回调泛型, 更安全的断点续传策略;
(2)支持标准的Cookie策略, 区分domain, path;
(3)事件注解去除不常用的功能, 提高性能;
(4)数据库api简化提高性能, 达到和greenDao一致的性能;
(5)图片绑定支持gif(受系统兼容性影响, 部分gif文件只能静态显示), webp; 支持圆角, 圆形, 方形等裁剪, 支持自动旋转。
二、环境搭建
在build.gradle中加入如下依赖,编写文章时,最新版本为3.5.0,可以到github或者maven仓库查询最新版本。
//gradle4.4之前
compile 'org.xutils:xutils:3.5.0'
//gradle4.4之后
implementation 'org.xutils:xutils:3.5.0'
需要的权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
配置
public class TRApplicaction extends Application {
@Override
public void onCreate() {
super.onCreate();
x.Ext.init(this);
x.Ext.setDebug(BuildConfig.DEBUG); // 是否输出debug日志, 开启debug会影响性能.
}
}
在AndroidManifest文件中注册TRApplicaction
<application
android:name=".TRApplicaction"
.../>
</application>
三、注解模块的使用
xUtils3自动注入注解 @ViewInject 真的是很好用,这样就不用一个个findById去注入组件了。
- Activity中注解的使用
@ContentView(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {
cc(R.id.viewpager)
ViewPager viewPager; //自动注入,不需要findById了
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main); //使用@ContentView注解就不需要了
x.view().inject(MainActivity.this); //这里尽量吧类名加上
...
}
}
- Fragment中注解的使用
@ContentView(R.layout.fragment_home)
public class HomeFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return x.view().inject(this, inflater, container);
}
@Override
public void onViewCreated(View v, @Nullable Bundle savedInstanceState) {
super.onViewCreated(v, savedInstanceState);
}
}
- 绑定事件
/**
* 1. 方法必须私有限定,
* 2. 方法参数形式必须和type对应的Listener接口一致.
* 3. 注解参数value支持数组: value={id1, id2, id3}
* 4. 其它参数说明见{@link org.xutils.event.annotation.Event}类的说明.
**/
@Event({R.id.new_model_btn,...})
private void onClick(View v){
....
}
四、网络请求
由于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 = new RequestParams(GetDataTask.BASE_URL+"upload");
params.setMultipart(true);
for (String key : map.keySet()) {
params.addBodyParameter(key, map.get(key).toString());
}
for (int i = 0; i < path.size(); i++) {
params.addBodyParameter("uploadfile" + i, new File(path.get(i)));
}
x.http().post(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 interface GetDataCallback {
void success(String result);
void failed(String... args);
}
}
发起网络请求
Map<String,Object> map = new HashMap<>();
map.put("pageNumber",page);
map.put("typeid",typeid);
//如果请求不需要参数,传null
// GetDataTask.post("app/types", null, new GetDataTask.GetDataCallback(){}
GetDataTask.post("app/types", map, new GetDataTask.GetDataCallback() {
@Override
public void success(String response) {
Gson gson = new Gson(); //后台返回来的json格式,其他格式自己处理
Result result = gson.fromJson(response, Result.class);
}
@Override
public void failed(String... args) {
}
});
五、绑定图片
//通过ImageOptions.Builder().set方法设置图片的属性
ImageOptions imageOptions= new ImageOptions.Builder().setFadeIn(true).build(); //淡入效果
//ImageOptions.Builder()的一些其他属性:
.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
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<Drawable>() {
@Override
public void onSuccess(Drawable result) {
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
x.image().loadDrawable(url, imageOptions, new Callback.CommonCallback<Drawable>() {...});
// 用来获取缓存文件
x.image().loadFile(url, imageOptions, new Callback.CommonCallback<File>() {...});
六、异步执行任务
x.task().run(new Runnable() {
@Override
public void run() {
//异步任务
}
});
x.task().post(new Runnable() {
@Override
public void run() {
//同步代码
}
});
七、ORM 数据库操作
Application中进行初始化配置DaoConfig
DbManager.DaoConfig daoConfig = new DbManager.DaoConfig()
//设置数据库名,默认xutils.db
.setDbName("myapp.db")
//设置数据库路径,默认存储在app的私有目录
.setDbDir(new File("/mnt/sdcard/"))
//设置数据库的版本号
.setDbVersion(2)
//设置数据库打开的监听
.setDbOpenListener(new DbManager.DbOpenListener() {
@Override
public void onDbOpened(DbManager db) {
//开启数据库支持多线程操作,提升性能,对写入加速提升巨大
db.getDatabase().enableWriteAheadLogging();
}
})
//设置数据库更新的监听
.setDbUpgradeListener(new DbManager.DbUpgradeListener() {
@Override
public void onUpgrade(DbManager db, int oldVersion, int newVersion) {
}
})
//设置表创建的监听
.setTableCreateListener(new DbManager.TableCreateListener() {
@Override
public void onTableCreated(DbManager db, TableEntity<?> table){
Log.i("JAVA", "onTableCreated:" + table.getName());
}
});
操作数据库
// User类在最底下
DbManager db = x.getDb(daoConfig);
db.dropDb(); // 删除数据库
db.dropTable(User.class); // 删除表
db.save(new User("nelson")); //新增数据
db.delete(User.class); //mtb_user表中数据将被全部删除
//条件删除:
WhereBuilder b = WhereBuilder.b();
b.and("id",">",2); //构造修改的条件
b.and("id","<",4);
db.delete(User.class, b);
修改数据
//第一种写法:
ChildInfo first = db.findFirst(ChildInfo.class);
first.setcName("zhansan2");
db.update(first,"c_name"); //c_name:表中的字段名
//第二种写法:
WhereBuilder b = WhereBuilder.b();
b.and("id","=",first.getId()); //构造修改的条件
KeyValue name = new KeyValue("c_name","zhansan3");
db.update(ChildInfo.class,b,name);
//第三种写法:
first.setcName("zhansan4");
db.saveOrUpdate(first);
条件查询
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<Parent> testList = db.selector(Parent.class).where("id", "between", new String[]{"1", "5"}).findAll();
@Table(name = "mtb_user",onCreated = "")
public class User {
/**
* name = "id":数据库表中的一个字段
* isId = true:是否是主键
* autoGen = true:是否自动增长
* property = "NOT NULL":添加约束
*/
@Column(name = "id",isId = true,autoGen = true,property = "NOT NULL")
private int id;
@Column(name = "username")
private String username;
......
}
关注
如果有问题,请在下方评论,或者加群讨论 200909980
关注下方微信公众号,可以及时获取到各种技术的干货哦,如果你有想推荐的帖子,也可以联系我们的。
关注公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
VirtualApk源码分析-BroadcastReceiver插件化
广播的注册分为静态注册和动态注册两种,android关于广播的源码分析可以参照此文 : https://www.jianshu.com/writer#/notebooks/11066526/notes/28225946 广播的插件化指的是插件能够接受到外部的广播,即插件apk里的Receiver对象能够响应对应的广播。动态注册的广播指的是在插件apk中调用registerReceiver进行注册的广播,这种场景不需要进行特别处理。 插件中静态注册的广播,VirtualApk处理的方式也很简单:将插件apk的AndroidManifest.xml中静态注册的Receiver通过动态registerReceiver注册到宿主Context中即可。 在加载插件Apk的时候通过PackageParser对Apk进行解析,生成LoadedPlugin对象,该对象内部有个 PackageParser.Package类型的变量mPackage,mPackager保存了插件apk的AndroidManifest.xml中注册的四大组件信息,通过读取mPackage里面的receivers,动态进行广播...
-
下一篇
2018 Google i/O大会Android技术总结
点击关注异步图书,置顶公众号 每天与你分享 IT好书 技术干货 职场知识 2018 Google I/O 开发者大会已于北京时间 5月 9日凌晨在山景城正式启幕,一起来看一下大会第一天都有哪些与开发者直接相关的内容吧。 Android P 新的Android P系统的发布是I/O大会第一天的重点,Google将其称为 10 周年的新一代版本,并主打智能化。具体体现在机器学习的引入,能够了解用户的使用习惯,并预测行动。包括像是 Adaptive Battery 自适应电池管理,可根据用户使用手机的功能和 APP的情况,自动调整系统性能和耗电,APP 唤醒造成的对 CPU 资源占用可降低 30% ;Adaptive Brightness自适应亮度管理,会更好地根据个人喜好和周围环境进行亮度调整。 Android P还引入了 ML Kit,这是一个新的软件开发工具包(SDK),允许开发者将大量 Google 预先建立的机器学习模型整合到他们的Android或iOS 应用中。模型包括支持文本识别、人脸检测、条码扫描、图像标记和地标识别等等,并且可以在线和离线使用。 总的来说,Androi...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 面试大杂烩
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- 2048小游戏-低调大师作品
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- MySQL数据库中FOR UPDATE的使用
- Docker快速安装Oracle11G,搭建oracle11g学习环境

微信收款码
支付宝收款码