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'

需要的权限

配置

public class TRApplicaction extends Application {

@Override

public void onCreate() {

super.onCreate();

x.Ext.init(this);

x.Ext.setDebug(BuildConfig.DEBUG); // 是否输出debug日志, 开启debug会影响性能.

}

}

在AndroidManifest文件中注册TRApplicaction

android:name=".TRApplicaction"

.../>

三、注解模块的使用

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 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() {

@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 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() {

@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 path, Map 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() {

@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 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() {

@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() {...});

// 用来获取缓存文件

x.image().loadFile(url, imageOptions, new Callback.CommonCallback() {...});

六、异步执行任务

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","

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 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

关注下方微信公众号,可以及时获取到各种技术的干货哦,如果你有想推荐的帖子,也可以联系我们的。

这里写图片描述

android xutils3 jar,Android全能开源项目xUtils3开发教程、简单封装相关推荐

  1. java的开源项目哪里找,我想参加开源项目的开发,请问在网上去哪找这样的项目? 纯C语言的(非C++或JAVA)...

    我想参加开源项目的开发,请问在网上去哪找这样的项目? 纯C语言的(非C++或JAVA)以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起 ...

  2. 推荐 12 个好用的 React 的开源项目,开发效率又能提升了!

    大家好,我是你们的 猫哥,那个不喜欢吃鱼.又不喜欢喵 的超级猫又在线营业啦 ~ 平时如何发现好的开源项目,可以看看这篇文章:GitHub 上能挖矿的神仙技巧 - 如何发现优秀开源项目 1. react ...

  3. 开源项目SMSS开发指南(二)——基于libevent的线程池

    libevent是一套轻量级的网络库,基于事件驱动开发.能够实现多线程的多路复用和注册事件响应.本文将介绍libevent的基本功能以及如何利用libevent开发一个线程池. 一. 使用指南 监听服 ...

  4. android xutils3 jar,android xutils3 Android基于开源项目xutils3实现下载

    上一次自己写了一个多线程断点续传下载的demo,过于麻烦,bug超多,所以我学习使用xutils来完成此功能. 先将xutils依赖搭建好(上一篇博客已经具体写了方法) 先看看效果图: 下面开始代码的 ...

  5. Android系统(97)---开源项目分类整理

    200多个开源项目分类整理,Android开发者珍藏必备 原文地址 http://www.apkbus.com/blog-955606-77825.html 日历 星期视图日历 https://git ...

  6. Android即时通讯和sns开源项目汇总

    这是一个整理即时通讯(IM)和社交系统(SNS)优秀开源项目的文档,项目上传github欢迎提交更新. 一 即时通讯和社交系统平台 1 环信(推荐) 2 阿里百川 云旺 3 融云 4 OpenSNS ...

  7. Android中比较好的开源项目整理

    记录一些比较好的Android开源项目: -自定义星级评论条 https://github.com/hedge-hog/RatingBar -高仿微信图片选择器 https://github.com/ ...

  8. Android仿今日头条的开源项目

    起因 看到众多大神纷纷有了自己的开源项目,于是自己琢磨着也想做一个开源项目来学习下,因为每次无聊必刷的app就是今日头条,评论简直比内容都精彩,所以我打算仿今日头条来练练手,期间也曾放弃过,也遇到很多 ...

  9. Android平台值得关注的开源项目

    [51CTO综合]移动开发技术越来越被开发者重视,前段时间,Windows Phone 7.MeeGo和BlackBerry都发布新工具以及平台,由于Android是开源平台,目前在开发者眼中分量也越 ...

  10. Android 仿今日头条的开源项目

    前言 看到众多大神纷纷有了自己的开源项目,于是自己琢磨着也想做一个开源项目来学习下,因为每次无聊必刷的 app 就是今日头条,评论简直比内容都精彩,所以我打算仿今日头条来练练手,期间也曾放弃过,也遇到 ...

最新文章

  1. 中企ITIL需软落地
  2. 5.11 加权Gram-Schmidt 分解
  3. 敌兵布阵 HDU - 1166 (线段树)
  4. 深入理解null的原理
  5. macOS修改Homebrew镜像
  6. LeetCode(181)——超过经理收入的员工(MySQL)
  7. 造节新案例,这家互联网公司用一场声音节圈住了声控党的心!
  8. 2015年OA选型一览表
  9. 下载阿里云大学的课程
  10. 安徽省省二级c语言准考证号查询系统,网办进度考试查询系统
  11. 寻租——乞丐没有白拿施舍
  12. html 5 游戏 脚本,HTML 5开发RPG游戏之四(游戏脚本化)(2)
  13. 如何在PC中升级和安装新的图形卡
  14. 计算算法的时间复杂度
  15. 长芯微32位MCU LCM32F103C8T6可P2P替换STM32F103C8T6,无需改动软件直接替代
  16. ZZULIOJ-1525-小P找座位
  17. 【名企笔试】小米实习生招聘(风口的猪)
  18. 使用MATLAB进行多元线性回归预测
  19. ARCGIS做好的模型工具,已经设置为相对路径,拷贝后工具显示叉叉不可用的原因
  20. python制作关键图谱_知识图谱neo4j—利用python进行知识入库

热门文章

  1. cuteftp连不上Linux虚拟机和传输文件问题的解决方案
  2. flashfxp中文破解版|flashfxp v5.4绿色破解版下载免注册码(强大的fxp/ftp客户端)
  3. 计算机应用为什么要学机械制图,简述机械制图学习的重要性
  4. 罗振宇跨年演讲全文、PPT、图解
  5. C语言入门教程(一)
  6. 国家计算机二级c语言历年真题及答案,全国计算机二级C语言历年真题
  7. 分布式系统及其优缺点
  8. 存储基础知识--存储网络
  9. Echert 缩放后切换再数据,缩放大小没还原的解决办法
  10. 也谈VC中ModifyStyleModifyStyleEx无法改变控件的Style)