• [微笑]建议你去学学边际理论!基本需求免费与高级需求收费并不矛盾,相反是更有利于保持社会的良性循环。 2019-07-15
  • 2017年秋季学期学员第十四支部风采 2019-07-15
  • 年龄大了,也想积点口德,已经给你笔下留情了。 2019-07-08
  • 【学习时刻】人大教授汪三贵:完成全面脱贫“军令状”离不开“绣花”真功夫 2019-07-02
  • 乌鲁木齐34个小区垃圾分类试点五年成效明显 居民准确分类垃圾分开收运 2019-07-02
  • 乌鲁木齐市天山区设红榜黑榜 每月考核辖区卫生 2019-06-24
  • 法媒:中国的变性人群体逐渐走出阴影 2019-06-21
  • 火到怀疑人生!这些抖音网红款奶茶,你统统拔草了吗? 2019-06-16
  • [视频]习近平打老虎动漫续集:当官要对自己狠一点 2019-05-28
  • 【学习时刻】中国改革开放新征程 全球经济复苏新起点 2019-05-25
  • 合肥一6万元旧车竟卖出20万天价 背后原因让人愤怒! 2019-05-25
  • 更加紧密团结在以习近平同志为核心的党中央周围  2019-05-21
  • 马拉维“红旗飘飘”十年间,中国工程印上了当地纸币 2019-05-21
  • 庆祝人民日报创刊70周年系列访谈之颜世贵 2019-05-15
  • 国产新型雷达芯片华睿2号与组网中心同时亮相 2019-05-15
  • 当前位置:浙江十一选五开奖直播 >  域名 >  正文 > 8月开花的草花有哪些?

      交易 任务 SEO服务 站长团购 联盟

    这时候,炼鬼道传人却是忽然朝着窗口奔去,眼看着就要破窗而出,剑九和周小妹已经迅疾冲了过去,生生将他拦截了下来。

    玫瑰能长多高?

    穆灵的瞳孔猛的一缩,他大喝一声,双手一挥,一股强悍的力量从他的手中涌现而出,然后化作一条长龙向着叶扬冲了过去。
    但是如果唐欣就只是异能者的话,那这场战斗便很难打。但是唐欣还有着一个身份——武道之人,而且唐欣的武道境界更是达到了汇神之境。与两个先天对站起来,唐欣算得上是绰绰有余了。异能只是饭前的一点开胃菜而已,唐欣的武道才是真正让人害怕的地方。

    月影错了直到这一刻才知道自己真的错了,自己还爱着他,爱得很深,原本以为自己只有恨没有爱,直到看到程风痛苦的表情,内心深处的声音再次响起。

    在Android上编写??榛钅浚ǚ耄?/h3>

    来源博客:Wang Jie"s Blog
    本文链接://blog.wangjiegulu.com/2018/02/13/writing_a_modular_project_on_android
    版权声明:本博客所有文章除特别声明外,均采用 CC BY 4.0 CN协议 许可协议。转载请注明出处。

    原文:https://medium.com/mindorks/writing-a-modular-project-on-android-304f3b09cb37

    浙江省11选五开奖结果:在Android上编写??榛钅浚ǚ耄?/h1>

    当我们在 Android Studio 上创建一个新的项目时,自带一个 app module。这时我们大多数人编写整个应用的地方。每次点击 run 按钮都会触发我们整个所有 module 上的 gradle 构建,并检查所有文件是否有变化。这就是为什么 gradle 构建会在更大的应用程序上花费 10分钟的时间,并且减慢开发者的输出。

    要解决这个问题,复杂的应用程序,如 Uber 决定对它们的应用程序进行??榛⒋又谢竦昧撕芏?。下面是试用??榛钅康囊恍┯攀疲?/p>

    • 更快的 gradle 构建
    • 跨应用/??楦从猛ㄓ玫墓δ?/li>
    • 易于插拔到Instant apps
    • 更好的团队工作,一个人可以单独负责一个???/li>
    • 更流畅地git flows

    由于上述优势,当我刚开始Posts这个应用时,我就在始终坚持使用??榛椒?。对此,Android 团队已经给我们提供了一些工具,但是我确实遇到了一些障碍,一下是我学习到的内容:

    我该怎么分割我的 modules ?

    你的应用程序是流程集构成的,比如,Google Play 有应用详情流,它包含了简要,描述详情,应用截图,评论活动等。

    所有这些都可以归为同一???—— app-details。

    你的应用会包含多个类似流程的???,有 authentication, settings, on-boarding等等。当然还有一些不需要UI元素呈现的??槿?—— notifications, analytics, first-fetch等等。这些??榘肓鞒逃泄氐?activities, repositories, entities和依赖注入相关东西。

    但是这些??橹凶苁怯幸恍┕餐墓δ芎凸ぞ?。这就是为什么你需要一个 core ???。

  • 给你的依赖注入框架提供全局依赖,如 Retrofit, SharedPreferences等等。
  • 包含工具类和扩展方法
  • 包含全局类和回调
  • 在 application 类中的初始化库,如 Firebase Analytics,Crashlytics,LeakCanary,Stetho等等
  • 怎么使用第三方库?

    核心(core)??榈钠渲幸桓鲋霸鹗俏愕墓δ?feature)??樘峁┩獠恳览?。这使得很容易实现在你的 feature ??橹泄蚕硐嗤姹镜目?。只需要在你的 core ??榈?dependencies 中使用 api,这样你就能在所有 feature ??橹惺褂盟?。

    dependencies {
        api fileTree(include: ["*.jar"], dir: "libs")
        api deps.support.appCompat
        api deps.support.recyclerView
        api deps.support.cardView
        api deps.support.support
        api deps.support.designSupport
    
        api deps.android.lifecycleExt
        api deps.android.lifecycleCommon
        api deps.android.roomRuntime
        api deps.android.roomRx
    
        api deps.kotlin.stdlib
    
        api deps.reactivex.rxJava
        api deps.reactivex.rxAndroid
    
        api deps.google.dagger
        kapt deps.google.daggerProcessor
    
        api deps.square.picasso
        api deps.square.okhttpDownloader
    
        api deps.square.retrofit
        api deps.square.okhttp
        api deps.square.gsonConverter
        api deps.square.retrofitRxAdapter
    
        implementation deps.facebook.stetho
        implementation deps.facebook.networkInterceptor
    
        testApi deps.test.junit
        androidTestApi deps.test.testRunner
        androidTestApi deps.test.espressoCore
    }

    有种依赖的可能性是只有对 feature-a ??橛杏?,但是在 feature-b 中无用。对于这种情况,我推荐在你的 core 的依赖中使用 api,因为 proguard 注意到而不会包含在 feature-b instant app 中。

    怎么使用 Room ?

    这个困扰我挺久的时间。我们希望把我们的数据库定义到 core ??橹?,因为它是我们应用程序要共享的通用的功能。为了让 Room 工作,你需要一个包含了所有 entity 类的数据库文件。

    @Database(entities = [Post::class, User::class, Comment::class], version = 1,exportSchema = false)
    abstract class PostDb : RoomDatabase() {
        abstract fun postDao(): PostDao
        abstract fun userDao(): UserDao
        abstract fun commentDao(): CommentDao
    }

    但是,如上面提到的,我们的 entity 类是被定义在 feature ??橹?,而且 core ??椴荒苋シ梦仕?。这是我碰到障碍的地方,经过一番思考后,你做了一件最棒的事,寻求 Yigit 的帮助。

    Yigit 阐明了观点,你必须要在每个 feature??橹卸即唇ㄒ桓鲂碌?db 文件,然后每个??橐桓鍪菘?。

    这有几个好处:

    • 迁移是??榛?/li>
    • 即时 app 仅包含它们需要的表
    • 查询会更快

    缺点:

    • 跨??槭莨叵到豢赡?/li>

    注意:为了 Room 的注解能够工作,不要忘记在你的 feature ??橹性黾酉旅嬉览?/em>

    kapt "android.arch.persistence.room:compiler:${versions.room}"

    怎么使用 Dagger 2 ?

    同样的问题 Dagger 也遇到了。我的 core ??橹械?application 类不能访问和初始化我 feature ??橹械淖榧?。这是从属组件完美的用例。

    你的 core 组件定义了它想要暴露给依赖组件的依赖关系

    @Singleton
    @Component(modules = [AppModule::class, NetworkModule::class, StorageModule::class, ImageModule::class])
    interface CoreComponent {
    
        fun context(): Context
    
        fun retrofit(): Retrofit
    
        fun picasso(): Picasso
    
        fun sharedPreferences(): SharedPreferences
    
        fun scheduler(): Scheduler
    }

    您的??樽榧?CoreComponent 定义为依赖项,并使用传递的依赖

    @ListScope
    @Component(dependencies = [CoreComponent::class], modules = [ListModule::class])
    interface ListComponent {
        fun inject(listActivity: ListActivity)
    }
    
    @Module
    @ListScope
    class ListModule {
    
        /*Uses parent"s provided dependencies like Picasso, Context and Retrofit*/
        @Provides
        @ListScope
        fun adapter(picasso: Picasso): ListAdapter = ListAdapter(picasso)
    
        @Provides
        @ListScope
        fun postDb(context: Context): PostDb = Room.databaseBuilder(context, PostDb::class.java, Constants.Posts.DB_NAME).build()
    
        @Provides
        @ListScope
        fun postService(retrofit: Retrofit): PostService = retrofit.create(PostService::class.java)
    }

    在哪里初始化我的 components ?

    我为我的功能的所有组件创建了一个单例 holder。这个 holder 用于创建,维护和销毁我的 component 实例。

    @Singleton
    object PostDH {
        private var listComponent: ListComponent? = null
    
        fun listComponent(): ListComponent {
            if (listComponent == null)
                listComponent = DaggerListComponent.builder().coreComponent(CoreApp.coreComponent).build()
            return listComponent as ListComponent
        }
    
        fun destroyListComponent() {
            listComponent = null
        }
    }

    注意:为了 Dagger 的注解能够工作,不要忘记在你的 feature ??橹性黾酉旅嬉览?/em>

    kapt "com.google.dagger:dagger-compiler:${versions.dagger}"

    总结

    尽管把你的单独的 application 转成??榛幸恍┘?,其中一些我试图通过上面的方法来解决,优点是深刻的。如果您在??橹杏龅饺魏握习?,请随时在下面提及它们,我们可以一起讨论解决方案。

    谢谢。

    当前文章://www.wmdzr.com/reg/

    发布时间:2019-07-17 02:39:46

    最新最全的八角金盘小苗价格表 直径8公分苦楝树多少钱一棵? 70cm瓜子黄杨什么价格? 丛生紫荆多少钱一棵? 品种真宗的木槿哪里买? 北京可以种植白玉兰吗? 爬山虎产地在哪里? 金边黄杨今年卖多少钱一株?

    创业有了,创新在哪儿? 陕西休闲农业旅游哪里去? 佛甲草养殖基地在哪里? 分会丨今年广西城际赛怎么玩? 牙疼吃什么可以缓解 【秀妍时尚】怎么佩戴戒指更有气质 【宠物健康】狗狗为什么频繁挠痒痒?什么原因? ???? 已经有老婆了,又遇到更喜欢的怎么办? 约伴 旅伴不会拍照是一种什么体验? 咨询师札记(五十四)借事练心,练的什么? 米径10公分乌桕树什么价格能买到? 【加盟政策】蜜雪冰城加盟又出新规,看你符合吗? 盛产CEO的英国大学,你的学校上榜了吗? 幼升小,你选好了吗? 《蜡笔小新》你知道背后的故事吗? 果岭草适合北方栽种吗? 金鸡菊六月份还可以种吗? 湖北适合种植狗尾巴草吗? 六月还能种植黑松吗?

    编辑:密侯建

      文章推荐

      分类排行榜

      专栏文章

      更多>

      服务推荐

      浙江十一选五开奖直播
      塔柏好还是刺柏好? 扫一扫关注最新创业资讯
    • [微笑]建议你去学学边际理论!基本需求免费与高级需求收费并不矛盾,相反是更有利于保持社会的良性循环。 2019-07-15
    • 2017年秋季学期学员第十四支部风采 2019-07-15
    • 年龄大了,也想积点口德,已经给你笔下留情了。 2019-07-08
    • 【学习时刻】人大教授汪三贵:完成全面脱贫“军令状”离不开“绣花”真功夫 2019-07-02
    • 乌鲁木齐34个小区垃圾分类试点五年成效明显 居民准确分类垃圾分开收运 2019-07-02
    • 乌鲁木齐市天山区设红榜黑榜 每月考核辖区卫生 2019-06-24
    • 法媒:中国的变性人群体逐渐走出阴影 2019-06-21
    • 火到怀疑人生!这些抖音网红款奶茶,你统统拔草了吗? 2019-06-16
    • [视频]习近平打老虎动漫续集:当官要对自己狠一点 2019-05-28
    • 【学习时刻】中国改革开放新征程 全球经济复苏新起点 2019-05-25
    • 合肥一6万元旧车竟卖出20万天价 背后原因让人愤怒! 2019-05-25
    • 更加紧密团结在以习近平同志为核心的党中央周围  2019-05-21
    • 马拉维“红旗飘飘”十年间,中国工程印上了当地纸币 2019-05-21
    • 庆祝人民日报创刊70周年系列访谈之颜世贵 2019-05-15
    • 国产新型雷达芯片华睿2号与组网中心同时亮相 2019-05-15
    • 广西快三计划精准公式 胜负彩任选9场推荐 浙江十一选五组2 香港赛马会直播结果 内蒙古时时彩走势带线 北京快三开奖查询结果 幸运赛车计划app 3d试机号30期 六合彩特码资料香港赛马会开奖结果香港六合彩香港六合彩香港赛马会资料六合网彩公司六和采香港六个彩网站六合彩资料六合彩信息 1到49连码的数字 在表格设钜阵条件公式 十一运夺金号码预测 北京赛车pk拾彩票 澳洲幸运10计划软件手机版下载 香港赛马会骗子