android MVVM+ dagger2 项目实践心得

作者: 岁月留痕 | 来源:发表于2018-12-15 23:41 被阅读4次

    适应人群:了解MVVM dagger2 想在项目中实践的人,学习知识还是要从官网源头上去看

    公司采用了mvvm(databinding)+dagger2 的开发模式,因为以前没有实际项目在实际项目使用过,实践过程中在一些细节上踩了不少坑,所以记录下,希望也能给观看此文的人节省一点宝贵的排错时间,珍爱生命,远离加班。。。。

    MVVM 与MVP 的区别?

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

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

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

    所以个人认为最大的区别就是上面一段话

    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" />
    
    和阿里的arouter路由框架一起使用

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

    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

    两个或多个返回同一个对象的方法

    在同一个module中很好排查,但是如果在依赖的其他module引用了,而dagger2的报错经常让人有点迷..,解决方案:方法上添加重名注释区分@Named()

    Lazy 和 Provider的区别

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

    Lazy<User> userLazy = null;
    user = userLazy.get()
    

    相关文章

      网友评论

        本文标题:android MVVM+ dagger2 项目实践心得

        本文链接:https://www.haomeiwen.com/subject/ewvahqtx.html