商城项目实战 | 10.1 xUtils3 详细介绍以及 ViewUtils 的使用方法

本文为菜鸟窝作者刘婷的连载。”商城项目实战”系列来聊聊仿”京东淘宝的购物商城”如何实现。
140套Android优秀开源项目源码,领取地址:http://mp.weixin.qq.com/s/afPGHqfdiApALZqHsXbw-A
或欢迎勾搭运营小姐姐(微信 id:BT474849)免费领取哦~

刚开始的时候,在 GitHub 上面出现了一款强大的开源框架叫 xUtils,里面包含了很多实用的android工具,并且支持大文件上传,更全面的 http 请求协议支持(10种谓词),拥有更加灵活的 ORM,更多的事件注解支持且不受混淆影响,该框架最低兼容版本为 android 2.2 (api level 8)。但是随着 Android 版本的不断更新,特别是 Android 6.0 之后,xUtils 的兼容不是很好,因此就出现了升级版的 xUtils,也就是 xUtils3。

xUtils3 详细介绍

xUtils3 是 xUtils 的升级版本,包含了orm, http(s), image, view注解, 但依然很轻量级(246K), 最主要是特性强大, 方便扩展,当然对比之前的 xUtils,在 xUtils3 中很多的 API 接口都已经改变了,使用方法也和之前不同了,所以本文主要是讲解最新的 xUtils3 的详细介绍以及该框架下的 ViewUtils 模块的最新用法。

1. xUtils3 的特性

1.1 xUtils3 的主要特性

xUtils3 的主要特性如下。

  1. 1.稳定的基石: AbsTask 和统一的回调接口 Callback, 任何异常, 即使你的回调方法实现有异常都会进入 onError,任何情况下 onFinished 总会让你知道任务结束了。
  2. 2.基于高效稳定的 orm 工具,http 模块得以更方便的实现 cookie (支持 domain、 path、 expiry 等特性)和 缓存(支持 Cache-Control、Last-Modified、 ETag 等特性)的支持。
  3. 3.有了强大的 http 及其下载缓存的支持,image 模块的实现相当的简洁,并且支持回收被 view 持有,但被 Mem Cache 移除的图片,减少页面回退时的闪烁。
  4. 4.View 注解模块仅仅400多行代码却灵活的支持了各种 View 注入和事件绑定, 包括拥有多了方法的 listener 的支持。

1.2 其他特性

xUtils3 的一些其他特性。

  1. 1.支持超大文件(超过 2G )上传。
  2. 2.更全面的 http 请求协议支持(11种谓词),在 xUtils 中只支持10种谓词。
  3. 3.拥有更加灵活的 ORM, 和 greenDao 一致的性能。
  4. 4.更多的事件注解支持且不受混淆影响。
  5. 5.图片绑定支持 gif (受系统兼容性影响, 部分 gif 文件只能静态显示)、webp,支持圆角,圆形, 方形等裁剪,支持自动旋转。
  6. 6.从 3.5.0 开始不再包含 libwebpbackport.so,需要在 Android4.2 以下设备兼容 webp 的请使用 3.4.0 版本。

2. xUtils3 主要四大模块

xUtils 中目前包括了主要的四大模块,分别为 DbUtils 模块、ViewUtils 模块、HttpUtils 模块以及 BitmapUtils 模块,下面对这四大模块进行介绍。

2.1 DbUtils 模块

  1. 1.Android 中的 orm 框架,一行代码就可以进行增删改查。
  2. 2.支持事务,默认关闭。
  3. 3.可通过注解自定义表名,列名,外键,唯一性约束,NOT NULL约束,CHECK 约束等(需要混淆的时候请注解表名和列名)。
  4. 4.支持绑定外键,保存实体时外键关联实体自动保存或更新。
  5. 5.自动加载外键关联实体,支持延时加载。
  6. 6.支持链式表达查询,更直观的查询语义。

2.2 ViewUtils 模块

  1. 1.android 中的 ioc 框架,完全注解方式就可以进行 UI,资源和事件绑定。
  2. 2.新的事件绑定方式,使用混淆工具混淆后仍可正常工作。
  3. 3.目前支持常用的20种事件绑定,比如 setClickListener 等。

2.3 HttpUtils 模块

  1. 1.支持同步,异步方式的请求。
  2. 2.支持大文件上传,上传大文件不会出现 oom 内存溢出情况。
  3. 3.支持 GET,POST,PUT,MOVE,COPY,DELETE,HEAD,OPTIONS,TRACE,CONNECT 的请求。
  4. 4.下载支持301/302重定向,支持设置是否根据 Content-Disposition 重命名下载的文件。
  5. 5.返回文本内容的请求(默认只启用了 GET 请求)支持缓存,可设置默认过期时间和针对当前请求的过期时间。

2.4 BitmapUtils 模块

  1. 1.加载 Bitmap 的时候无需考虑 Bitmap 加载过程中出现的 oom 和 android 容器快速滑动时候出现的图片错位等现象。
  2. 2.支持加载网络图片和本地图片。
  3. 3.内存管理使用 lru 算法,更好的管理 Bitmap 内存。
  4. 4.可配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等。

xUtils3 中 ViewUtils 的主要作用

ViewUtils 的主要作用有两点,一是可以完全注解方式就可以进行 UI 绑定和事件绑定,另外一个就是无需 findViewById 和 setOnClickListener 等。而其中的 UI 绑定和事件绑定下面详细介绍。

1. UI 绑定

UI 绑定简而言之就是针对于控件和 View 了,分为多种绑定方法。


@ContentView(R.layout.view_acti); //setContentView 注解在activity的声明上方
@ViewInject(R.id.lv_test); //反射view  注解在一个view声明上

2. 事件绑定

事件绑定就是指监听事件的注解,比如 setOnClickListener 等。

@Event(R.id.button) //将一个自定义的方法绑定到一个 view 的事件上

至于具体的使用方法就在下面了。

xUtils3 中 ViewUtils 的使用方法

xUtils3 框架中包含了很多的工具,主要的四大模块功能也很强大,这次主要是要讲解其中的 ViewUtils 模块的使用。

1. Gradle 添加依赖

在 module 下的 build.gradle 文件下面添加对 xUtils3 的依赖。

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.2.0'
    compile 'com.android.support.constraint:constraint-layout:1.0.1'
    testCompile 'junit:junit:4.12'
    compile 'org.xutils:xutils:3.5.0'
}

2. ViewUtils 初始化

在 Activity 和 Fragment 中初始化 ViewUtils 模块略有不同,所以就分开介绍了。

2.1 Activity 中初始化

在 Activity 中初始化比较简单,直接在 onCreate 中一行代码就搞定了。

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        x.view().inject(this);
    }

2.2 Fragment 中初始化

Fragment 的生命周期依赖于 Activity,另外在 Fragment 中一些方法也与 Activity 不同,所以 ViewUtils 的初始化方法也不太一样了。

private boolean injected = false;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        injected = true;
        return x.view().inject(this, inflater, container);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        if (!injected) {
            x.view().inject(this, this.getView());
        }
    }

其中 injected 是用来标识是否已经注入了 View ,如果还没有注入,在 onViewCreated 中要写入注入 View 的方法。

3. ViewUtils 绑定控件

一般在 Activity 或者 Fragment 中声明控件,都要使用方法 findViewById,如果控件一旦多了,就会很麻烦,代码要写不少,但是使用 ViewUtils 可以通过注解的方式直接进行 UI 绑定,方法也很简单。

@ViewInject(R.id.textView)
private TextView textView;

4. ViewUtils 绑定布局

在为 Activity 或者 Fragment 添加布局时,我们都会使用到 setContentView(int layoutRes) 方法,在 ViewUtils 添加了直接注解布局的方法,如下。

@ContentView(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {
   .....
}

在 Fragment 中注解方法是一样的,在 Fragment 中直接添加就好。

5. ViewUtils 绑定事件

在之前的按钮的点击事件、列表选项的 item 点击事件等,写起来代码都比较多些,而使用 ViewUtils 都可以变得简单起来,先来看下按钮的点击事件的绑定。

// 取消了之前使用方法名绑定事件的方式,使用id绑定不受混淆影响
// 支持绑定多个id @Event({R.id.id1, R.id.id2, R.id.id3})
// or @Event(value={R.id.id1, R.id.id2, R.id.id3}, parentId={R.id.pid1, R.id.pid2, R.id.pid3})
// 更多事件支持参见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event。
@Event(R.id.test_button)
public void testButtonClick(View v) { // 方法签名必须和接口中的要求一致
    ...
}

上面是按钮的点击事件的绑定,很方便,再来看看列表选项的 item 点击事件的绑定。

//选项的点击事件 OnItemClickListener
@Event(value = R.id.lv_img, type = AdapterView.OnItemClickListener.class)
    private void onImageItemClick(AdapterView<?> parent, View view, int position, long id) {
        ....
    }

ViewUtils 所支持的事件的绑定还有很多种,这里就主要介绍上面两种,更多的使用方法请参考 xUtils3 源码

结束语

xUtils3 在 xUtils 的基础上优化了不少,ViewUtils 注解也更为的简单明了,有了 ViewUtils,我们就不用像之前一样不断的对控件进行声明,另外对于事件的处理也简化了不少,在后期的商城项目实战中,都将使用 ViewUtils 来做 UI 的绑定以及事件的绑定。

【五一大促】菜鸟窝全场android项目实战课程低至五折,更有价值33元的四款热门技术免费领,17年初优惠力度最大的一次活动,有意向的童鞋不要错过
狂戳>>http://www.cniao5.com/hd/2017/51.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,439评论 25 707
  • 太长了,还是转载吧...今天在看博客的时候,无意中发现了@Trinea在GitHub上的一个项目Android开源...
    庞哈哈哈12138阅读 20,138评论 3 283
  • 第二章:故事的功能 一个精彩的故事可以让人快速掌握事情的关键点。我们通过故事整理、展示自己,也透过故事让别人快速认...
    谢行知阅读 667评论 0 2
  • 引言# 又一周过去了,时间似穿梭般过得飞快。像一叶驶离渡口的舟,一蒿撑过,我离我的30岁越来越远了。与30岁之前内...
    Eutopia405阅读 249评论 0 0
  • 14天的小白训练营就算毕业了,但是我的投资理财路才刚刚开始,在接触长投之前,我只知道投资的水很深,却没想过路...
    Oo婷阅读 185评论 1 0