Android 的软件架构 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
silvernoo
V2EX    Android

Android 的软件架构

  •  
  •   silvernoo 2019-09-07 00:27:08 +08:00 15168 次点击
    这是一个创建于 2235 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近从头写一个安卓 APP,用上了 AndroidX 工具包和 MVVM 架构,依赖注入框架,双向绑定,事件驱动。感觉安卓软件复杂度直接上了几个台阶,大量代码依靠动态生成。编译报错不太容易定位。

    而且 Android 的双向绑定真不像前端那么易用,不但代码量大增,还有无数的坑。目前还是边写边熟悉的阶段,开发效率低下。我有时候觉得未免太过度设计了。说了这么多,可能是我自己太菜了。
    21 条回复    2019-09-08 01:13:34 +08:00
    bccoder
        1
    bccoder  
       2019-09-07 00:51:33 +08:00 via iPhone
    其他还好,我觉得 dagger 这种东西就增加了很多复杂度而且繁琐。可能是我太菜了。
    HarryQu
        2
    HarryQu  
       2019-09-07 00:55:16 +08:00 via Android
    很多页面业务都不复杂。mvc 就搞定了。
    有些简单的页面,代码全写在 activity 都行。
    优化是一步步来的,你使用的框架越多,出问题的时候越难排查 bug。
    双向绑定,就用回调就可以啦,或者用 eventbus。
    KunMinX
        3
    KunMinX  
       2019-09-07 01:01:16 +08:00   3
    DataBinding 的存在,是为了解决视图的一致性问题。

    LifeCycler 的存在,是为了解决生命周期处理的一致性问题。

    LiveData 的存在,是为了让新手老手都能 不假思索地形成 通过唯一可信源分发状态 的开发模式。

    ViewModel 的存在,是为了建立起作用域可控的、可共享的状态管理。

    Navigation 的存在,是为了通过声明式编程来解决应用内导航的一致性问题。



    综上,它们的存在,大都是通过解决一致性问题,来规避开发过程中 90% 的不可预期的错误。

    不可预期的错误是十分耗费时间的,标准化开发模式的确立,能够让开发者不假思索地在开发时按部就班、效率倍增。



    如果这样说还不理解的话,详见:

    https://xiaozhuanlan.com/topic/3684721950
    axlecho
        4
    axlecho  
       2019-09-07 02:58:54 +08:00 via Android
    边写边学不建议用框架跟 kotlin
    300
        5
    300  
       2019-09-07 06:57:17 +08:00 via Android
    @HarryQu #2 你这几句话不是坏就是蠢
    我们公司新来一 sx 就是你这种思想

    为什么要怎么复杂,为什么一定要用 viewmodel ?
    300
        6
    300  
       2019-09-07 07:02:44 +08:00 via Android
    @winterbells #5
    代码写在 activity 不就行了,new 一个 thread 什么都能跑。
    viewmodel 怎么通知 activity,fragment 怎么传消息。一个 eventbus 解决所有。

    这种代码最后写出来还是人看的吗?

    还有双向绑定用回调?什么回调? databinding 给你什么接口回调了?
    Lin0936
        7
    Lin0936  
       2019-09-07 07:10:00 +08:00 via Android
    其它还好,dagger2 这个东西谁用谁歇逼
    300
        8
    300  
       2019-09-07 07:13:12 +08:00 via Android   1
    “而且 Android 的双向绑定真不像前端那么易用,不但代码量大增,还有无数的坑。”

    双向绑定代码是减少的,至少少了一步走 view 层的代码。model 处理完之后页面自动就刷新了。
    难用是真的,主要报错太难找。但有个方法可以看到具体报错信息。
    在 AS 右边有个 gradle 选项卡,点开后选择一个项目或模块,然后选 other,往下一直翻,有个叫 kaptXXXdebug 或者 kaptXXXrelease ( xxx 为当前 build ),双击跑一下就能看到 xml 里哪一行的 databinding 报错了
    kx5d62Jn1J9MjoXP
        9
    kx5d62Jn1J9MjoXP  
       2019-09-07 07:13:48 +08:00 via Android
    databinding 不是必用的,谷歌的文档里也是“if you use data binding,那么可以怎么怎么的”
    HarryQu
        10
    HarryQu  
       2019-09-07 09:34:46 +08:00 via Android
    @winterbells 首先工程中直接使用 thread、网络等模块而不封装。你用啥架构都不好使。

    其次讨论问题就讨论问题,上来就喷人,谁惯着你的臭毛病?
    seagull007
        11
    seagull007  
       2019-09-07 09:50:36 +08:00 via iPhone
    @KunMinX 理解到位
    hyyou2010
        12
    hyyou2010  
       2019-09-07 09:53:01 +08:00
    说得是 jetpack 那一套吗?
    HongJay
        13
    HongJay  
       2019-09-07 10:38:41 +08:00
    @KunMinX 学习了
    arrow2015
        14
    arrow2015 &nsp;
       2019-09-07 11:09:02 +08:00
    待了 2 家公司 a 和 b,a 2 年,b 1 年半。a 公司的架构和楼主差不多,啥都用上了。b 公司用的很少,只用了 okhttp,eventbus,和一个图片加载库。都体验过后,我更喜欢 b 公司的代码结构。少用框架对提升编程水平有很大的帮助。楼主说的这些库里面,dagger 和 databinding 对编译超级不友好,编译出错后很难定位问题。另外这 2 个库用了之后我感觉写起代码很不自由。我觉得 @HarryQu 说的对,mvc 很好用,简单页面全写在 activity 没有任何问题。如果是简单页面,用 mvp,livedata,viewmodel 的话,代码量比全写在 activity 里多很多,也没啥优势,一个简单点击事件的处理分散在好几个文件里,来回跳转跟踪代码很麻烦。
    arrow2015
        15
    arrow2015  
       2019-09-07 11:19:30 +08:00
    “而且 Android 的双向绑定真不像前端那么易用,不但代码量大增,还有无数的坑。目前还是边写边熟悉的阶段,开发效率低下。我有时候觉得未免太过度设计了。说了这么多,可能是我自己太菜了。”
    建议楼主不用继续研究 databinding 了。我用过 1 年多 databinding。现在我写新的应用,我是不会用它了。
    loshine1992
        16
    loshine1992  
       2019-09-07 11:24:58 +08:00
    最近用 LiveData + ViewModel + Kotlin + Koin + Navigation + coroutines 写

    一个 Activity 搞定,Dagger 和 Databinding 这俩完全可以放弃了,不建议再学习
    leopku
        17
    leopku  
       2019-09-07 11:43:00 +08:00 via Android
    主要报错信息太难看,还有传值,代码清晰了
    momocraft
        18
    momocraft  
       2019-09-07 11:55:03 +08:00
    不笑不足以道
    crayygy
        19
    crayygy  
       2019-09-07 13:47:27 +08:00 via iPhone
    我们最近一个新项目把这里面提到的能用的几乎都给用了,Data binding,ViewModel,LiveData,Lifecycle,navigation,实话说整体学习曲线较高,不熟悉的人刚进来会很累,熟悉了以后成本比较低。

    依赖注入用的是 Koin,没用过 dagger2 不评价,Koin 还是很好用的,可以尝试一下
    maokabc
        20
    maokabc  
       2019-09-07 14:37:15 +08:00 via Android   1
    之前就是直接写 activity 里只用了 eventbus,greendao 这类东西,后面看着 activity 里一大坨实在受不了。重构换 aac 了,双向绑定用着是真舒服,虽然报错蛋疼,但比以前代码里更新 view 状态爽太多。
    mxalbert1996
        21
    mxalbert1996  
       2019-09-08 01:13:34 +08:00 via Android
    关于 Data Binding 的报错,Android Studio 3.5 里改进了很多了,基本只通过正常 Build 的错误信息就能找到哪里错了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5623 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 06:48 PVG 14:48 LAX 23:48 JFK 02:48
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86