android MVVM+ dagger2 +Arouter 走的那些坑

适应人群:对相关技术有一点了解的人,这篇文章主要是记录自己在使用中遇到的一些问题,网上记录的文章要么太过零散,要么都是千遍一律的小白入手,希望能给代价带来一点帮助

image

在记录的同时,我慢慢的自己也在总结,之所以出现这些问题的根节在于对知识点理解的不成体系,有些问题本身已经在官网文档中有记录,另外自己使用的时候是现学现卖,网上很多资料过于小白,真正实践的问题方面大部分单独一篇一小段,每次踩坑后又要继续查,所以希望做成一个大全

MVVM 与MVP 的区别易错点

作为一个超级小白刚看到mvvm的时候,很诧异,mvvm 不就是一个Model (数据模型) ,ViewModel(业务层) ,View(视图层),另一个VM在哪?原来MVVM的VM是ViewModel 的缩写,但是明明就是业务层为什么叫ViewModel呢?

引用其他文章看到的一句话

vewModel 通过双向数据绑定把 View 层和 Model 层连接了起来,而View 和 Model 之间的同步工作完全是自动的,无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作DOM, 不需要关注数据状态的同步问题,复杂的数据状态维护完全由 MVVM 来统一管理···

所以个人认为最大的区别就是上面这段话,总结下来,MVP的优点MVVM也有,低耦合,可重用,可测试;MVVM有的双向绑定,MVP却没有。

databinding

databinding 将数据模型通过表达绑定到UI组件上,让代码更简洁,让程序员更加专注于业务代码的编写,比如省去了findViewById ,设置值更新UI的代码。。,事件绑定,规避了NullPointException等。
性能方面: 在编译时生成相应的设置值,绑定view的代码,再次使用该控件无需(FindViewById)遍历查找,原理
官方推荐实践:不要在布局文件中编写复杂逻辑的表达式
缺点: 不利于调试(还没遇到过,只是简单表达式),个人觉得xml中对语法提示支持还不是很好,例如与String.format结合后,属性弹不出,错误提示不太友好
推荐的插件:databinding

明明在xml中绑定了事件和属性但界面没有变化
忘记给databinding中的变量设置值

databinding.setVabrible(BR.viewModel,viewModel);

NUll ,默认如果属性字段为空,程序不会报错,但是界面会显示个Null,规避方法 `` 在Esc 键下面

android:text="@{item.name ?? ``}"

与String.xml 格式化的结合使用
需要注意的是会有严格类型检查 %d %f %s 等

<string name="fake_data">待处理%1d</string>
<string name="fake_data1">待处理%1s</string>
android:text="@{@fake_data(item.fake_count)}"
android:text="@{@fake_data(item.fake_str:``)}"

/ data binding error ****msg:Identifiers must have user defined types from the XML file. View is missing it
忘记导入view

<layout xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    <data>
        <import type="android.view.View" />
    </data>
<import type="android.view.View" />

“找不到符号 BR”

Dagger2、DataBinding、ButterKnife、DbFlow等这些第三方库都是基于Annotation,它们在编译时动态生成代码,它们之间会相互影响,一个出错了,会导致Annotation编译时中断
相关

其实在官方也有说明,据说 V2 编译器进行了更改,没试过,项目aar打包 不敢擅动,需要gradle 3.1,加了这个感觉也是有点坑,error太多,不好找,希望能忽略不相关error

allprojects {
    afterEvaluate {
        tasks.withType(JavaCompile.class) {
            options.compilerArgs << "-Xmaxerrs" << "500"
        }
    }
}

与include 配合使用 databinding 没有生成 include 文件控件变量
具体解决方案 将include布局设置id,就会生成相关变量,使用的时候

databinding.<include布局Id>.<布局下相关控件>
和阿里的arouter路由框架一起使用

当编写了好几个代码文件,其中一个Arouter的@Autowired定义的字段没有能设置为私有在编译时,会让人崩溃,所有的databingding文件全报错,而独独真实的异常怎么也找不到

Arouter 相关总结

传值
arouter 很灵活,对他不是很了解的时候,不能发挥它最大的威力,传值的时候不仅可以传String还能传对象

@Autowired
Object object;

'''''
Arouter.getInstance().inject(this);
'''

设置activity flag ,以及fragment不能设置startActivityForResult
默认只能设置一个flag,不知道是我不熟悉还是什么原因,按道理写框架的人不会犯这么低级的错误

Postcard postcard = ARouter.getInstance().build(url);
LogisticsCenter.completion(postcard);
Class<?> destination = postcard.getDestination();

Intent intent = new Intent(getContext,destination);

LiveData

还没发现什么特别的地方,和RxJava一样作为响应式编程典范,都是订阅者模式,LiveData优点来说是对界面生命周期的监听,以及与databinding的适配,还有一点需要注意的是当界面不可见无法接收到事件,对于新注册的Observe会返回前面所有的事件,俗称:粘性事件;RxJava有着事件序列调度的优点

dagger2

Dagger2是Dagger的升级版,是一个依赖注入框架,第一代由大名鼎鼎的Square公司共享出来,依赖注入是面向对象编程的一种设计模式。
相关文章 重要概念
使用下来感觉是省去了一些生成对象的重复工作,所有的moudle(new 对象)都能被重复利用,和spring2.5以后的注解类有点类似。中间踩了不少坑。

学习成本

新人刚面对一个成熟dagger2编写的项目,要理清里面的脉络需要花费一些时间

与databingding 一起使用,编译异常时误报

偶尔忘记加上一个@Inject ,导致一大堆的databinding类集体报找不到,解决方案是滑倒最底部会有异常提示

app 层组件使用到子组件的依赖

另外加上@Scope 作用域,让问题很难排查,解决方案:检查报错组件所引用的对象是否有引用到子组件(Activity或者Fragment) 如果有把该module include到该component, 修改两个依赖组件的 @Scope

同名返回值和方法名

这个尽量小心再小心,尤其容易出现在拷贝粘贴的时候迷..,解决方案:方法上添加重名注释区分
@Named()

Lazy 和 Provider的区别

Lazy 的作用会在调用的时候初始化,下次get的时候会同一个对象
Provider 也是延迟加载,但是下次调用的时候会返回一个新的对象

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

推荐阅读更多精彩内容