这几天把公司的电商软件第一版完成之后,打算把项目重新优化并排版一下,让软件整体看起来更加美观。作为一名优(lan)雅(duo)的程序猿,一定要时刻保持优雅的情操,比如FindViewById()和SetOnclick等方法,用起来是真心不优雅,打算使用Xutils3的注解功能,之前一直使用的是Xutils,但是Github上面的Xutils已经很久没有更新了,而且Xutils对Android6.0的兼容性不是特别好,于是搜了一下,决定把Xutils和Xutils3的基本知识整理一下方便更多的人学习使用。
一、Xutils简介: Xutils是前几年比较火得一个开源框架,Xutils包含了很多实用的工具类,支持大文件上传,且有更全面的http请求协议支持,拥有灵活的Orm,支持事件注解且不受代码混淆影响。Xutils刚问世的时候真是很多屌丝程序猿的福利啊,集成了这么多功能强大的模块,大家果然都爱不释手,但是随着Android版本的升级和人们开发软件思想的转变,Xutils也暴露出了很多问题,现在用Xutils的已经不是特别的多了,如果想使用的话,推荐使用比较新的Xutils3。
二、Xutils的主要模块:不管是老版本的Xutils还是新版本的Xutils3,总的来说,他们都分了四个重要的模块:ViewUtils,HttpUtils,BitmapUtils,DbUtils。附带的还有一个LogUtils,可以用来输出Log日志,用起来也是蛮方便的。不管是老版本的Xutils还是新版本的Xutils3,总的来说,他们都分了四个重要的模块:ViewUtils,HttpUtils,BitmapUtils,DbUtils。附带的还有一个LogUtils,可以用来输出Log日志,用起来也是蛮方便的。
- ViewUtils模块 主要用来代替findViewById()的,也可以用来给控件添加点击事件
-
- @ViewInject(R.id.textView)
- TextView textView;
-
-
-
-
- @ResInject(id = R.string.label, type = ResType.String)
- private String label;
-
-
-
-
-
- @OnClick(R.id.test_button)
- public void testButtonClick(View v) {
- ...
- }
- ...
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- ViewUtils.inject(this);
- ...
- textView.setText("some text...");
- ...
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.bitmap_fragment, container, false);
- ViewUtils.inject(this, view);
- ...
- }
-
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- ViewUtils.inject(this, getPreferenceScreen());
- ...
- }
-
-
-
-
-
-
-
-
- HttpUtils模块 主要用来进行各种常见网络请求和文件下载以及上传。
-
- HttpUtils http = new HttpUtils();
- http.send(HttpRequest.HttpMethod.GET,
- "http://www.lidroid.com",
- new RequestCallBack<String>(){
- @Override
- public void onLoading(long total, long current, boolean isUploading) {
- testTextView.setText(current + "/" + total);
- }
-
- @Override
- public void onSuccess(ResponseInfo<String> responseInfo) {
- textView.setText(responseInfo.result);
- }
-
- @Override
- public void onStart() {
- }
-
- @Override
- public void onFailure(HttpException error, String msg) {
- }
- });
-
-
- RequestParams params = new RequestParams();
- params.addHeader("name", "value");
- params.addQueryStringParameter("name", "value");
-
-
-
- params.addBodyParameter("name", "value");
-
-
-
-
-
-
- params.addBodyParameter("file", new File("path"));
-
- HttpUtils http = new HttpUtils();
- http.send(HttpRequest.HttpMethod.POST,
- "uploadUrl....",
- params,
- new RequestCallBack<String>() {
-
- @Override
- public void onStart() {
- testTextView.setText("conn...");
- }
-
- @Override
- public void onLoading(long total, long current, boolean isUploading) {
- if (isUploading) {
- testTextView.setText("upload: " + current + "/" + total);
- } else {
- testTextView.setText("reply: " + current + "/" + total);
- }
- }
-
- @Override
- public void onSuccess(ResponseInfo<String> responseInfo) {
- testTextView.setText("reply: " + responseInfo.result);
- }
-
- @Override
- public void onFailure(HttpException error, String msg) {
- testTextView.setText(error.getExceptionCode() + ":" + msg);
- }
- });
-
- HttpUtils http = new HttpUtils();
- HttpHandler handler = http.download("http://apache.dataguru.cn/httpcomponents/httpclient/source/httpcomponents-client-4.2.5-src.zip",
- "/sdcard/httpcomponents-client-4.2.5-src.zip",
- true,
- true,
- new RequestCallBack<File>() {
-
- @Override
- public void onStart() {
- testTextView.setText("conn...");
- }
-
- @Override
- public void onLoading(long total, long current, boolean isUploading) {
- testTextView.setText(current + "/" + total);
- }
-
- @Override
- public void onSuccess(ResponseInfo<File> responseInfo) {
- testTextView.setText("downloaded:" + responseInfo.result.getPath());
- }
-
-
- @Override
- public void onFailure(HttpException error, String msg) {
- testTextView.setText(msg);
- }
- });
-
- handler.cancel();
-
BitmapUtils模块 主要用来加载ImageView的图片资源,可以本地图片,也可以是网络图片
- BitmapUtils bitmapUtils = new BitmapUtils(this);
-
-
-
- bitmapUtils.display(testImageView, "http://bbs.lidroid.com/static/image/common/logo.png");
-
-
-
- bitmapUtils.display(testImageView, "/sdcard/test.jpg");
-
-
-
- bitmapUtils.display(testImageView, "assets/img/wallpaper.jpg");
-
-
-
- listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true));
- listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true, customListener));
- DbUtils db = DbUtils.create(this);
- User user = new User();
- user.setEmail("wyouflf@qq.com");
- user.setName("wyouflf");
- db.save(user);
-
-
- Parent entity = db.findById(Parent.class, parent.getId());
- List<Parent> list = db.findAll(Parent.class);
-
- Parent Parent = db.findFirst(Selector.from(Parent.class).where("name","=","test"));
-
-
- Parent Parent = db.findFirst(Selector.from(Parent.class).where("name","=", null));
-
- Parent Parent = db.findFirst(Selector.from(Parent.class).where("name","!=", null));
-
-
- List<Parent> list = db.findAll(Selector.from(Parent.class)
- .where("id" ,"<", 54)
- .and(WhereBuilder.b("age", ">", 20).or("age", " < ", 30))
- .orderBy("id")
- .limit(pageSize)
- .offset(pageSize * pageIndex));
-
-
- Parent test = db.findFirst(Selector.from(Parent.class).where("id", "in", new int[]{1, 2, 3}));
-
- Parent test = db.findFirst(Selector.from(Parent.class).where("id", "between", new String[]{"1", "5"}));
-
- DbModel dbModel = db.findDbModelAll(Selector.from(Parent.class).select("name"));
- List<DbModel> dbModels = db.findDbModelAll(Selector.from(Parent.class).groupBy("name").select("name", "count(name)"));
-
- List<DbModel> dbModels = db.findDbModelAll(sql);
- db.execNonQuery(sql)
ok,关于Xutils的使用就简单地介绍这么多,ViewUtils,HttpUtils,BitmapUtils,
DbUtils这
4个模块的使用其实还是有一定规律的,除了DbUtils使用create创建对象外,其余的3个模块都是使用new来创建对象的。
四、接下来再说一下Xutils3的4个模块:
- xUtils3变化较多所以建立了新的项目不在旧版(github.com/wyouflf/xUtils)上继续维护, 相对于旧版本:
- HTTP实现替换HttpClient为UrlConnection, 自动解析回调泛型, 更安全的断点续传策略.
- 支持标准的Cookie策略, 区分domain, path...
- 事件注解去除不常用的功能, 提高性能.
- 数据库api简化提高性能, 达到和greenDao一致的性能.
- 图片绑定支持gif(受系统兼容性影响, 部分gif文件只能静态显示), webp; 支持圆角, 圆形, 方形等裁剪, 支持自动旋转..
以上是官方的说明,下面来看具体使用。
Xutils3的使用方式和Xutils有很大的改变,所以请新建一个工程,按照下面的步骤操作:
- 首先新建一个Application类,在里面对Xutils3做初始化工作:
-
- @Override
- public void onCreate() {
- super.onCreate();
- x.Ext.init(this);
- x.Ext.setDebug(BuildConfig.DEBUG);
- }
xutils3和Xutils使用方式有一些区别,以前是使用new得到各模块的对象,现在使用:x.模块名()得到对象,回调接口也使用统一的一个,回调接口支持泛型。
- ViewUtils的使用基本没有变,只是绑定点击事件的时候有些出入:
-
- @ViewInject(R.id.txtv)
- private TextView txtv;
- @ViewInject(R.id.imgv)
- private ImageView imgv;
绑定事件:
-
-
-
-
- @Event(value = R.id.btn, type = View.OnClickListener.class)
- private void btnClick(View view) {}
-
- RequestParams params = new RequestParams("http://www.baidu.com");
- x.http().get(params, new CommonCallback<String>() {
-
- @Override
- public void onCancelled(CancelledException arg0) {
-
- }
-
- @Override
- public void onError(Throwable arg0, boolean arg1) {
-
- }
-
- @Override
- public void onFinished() {
-
- }
-
- @Override
- public void onSuccess(String arg0) {
-
- txtv.setText(arg0);
- }
- });
-
- ImageOptions options = new ImageOptions.Builder()
-
- .setIgnoreGif(false)
-
- .setImageScaleType(ScaleType.CENTER_CROP)
-
- .setLoadingDrawableId(R.drawable.ic_launcher)
-
- .setFailureDrawableId(R.drawable.ic_launcher)
-
- .build();
-
- x.image().bind(imgv, imagUrl, options, new CommonCallback<Drawable>() {
- @Override
- public void onSuccess(Drawable arg0) {
- LogUtil.e("下载成功");
- }
-
- @Override
- public void onFinished() {
- LogUtil.e("下载完成");
- }
-
- @Override
- public void onError(Throwable arg0, boolean arg1) {
-
- LogUtil.e("下载出错," + arg0.getMessage());
- }
-
- @Override
- public void onCancelled(CancelledException arg0) {
- LogUtil.e("下载取消");
- }
- });
-
-
-
-
-
-
-
先建一个类,用来生成数据库中的表,这里新建一个StudentInfo类(注意里面的@标签的使用,使用这些标签生成表的结构信息)内容如下:
- @Table(name = "info")
- public class StudentInfo {
- @Column(name = "id", isId = true)
- private int id;
- @Column(name = "name")
- private String name;
- @Column(name = "age")
- private int age;
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public int getAge() {
- return age;
- }
-
- public void setAge(int age) {
- this.age = age;
- }
-
- }
然后:
- DbManager.DaoConfig daoConfig = new DaoConfig()
-
- .setDbName("SudentInfo")
-
-
-
-
- .setDbVersion(1)
-
- .setDbUpgradeListener(new DbUpgradeListener() {
- @Override
- public void onUpgrade(DbManager arg0, int arg1, int arg2) {
- LogUtil.e("数据库版本更新了!");
- }
- });
- DbManager manager = x.getDb(daoConfig);
- try {
-
- StudentInfo info = new StudentInfo();
- info.setAge(16);
- info.setName("小花");
-
- manager.saveOrUpdate(info);
- } catch (DbException e) {
- e.printStackTrace();
- }
最后附带上Xutils和Xutils3的Github项目地址:
xUtil的源码项目下载地址:点击打开链接
xUtils3的源码项目下载地址:点击打开链接