• 置之无形之中听惊雷! 2019-06-11
  • 新疆铁路端午小长假加开41列旅客列车 2019-06-09
  • 说的有道理 。说明我们的教育方向确实是有问题,毛主席当年对教育领域的有关指示是正确的。 2019-06-09
  • 人民日报发喜报庆祝我国第一颗氢弹爆炸成功 2019-05-30
  • 96次航拍峨眉 换个角度看巴蜀名山 中国国家地理网 2019-05-30
  • 陈秋冬:评估AI项目 我们需要思考三个问题 2019-05-03
  • 浙江:大学生就业实习平台启用 2019-05-03
  • 人民日报人民时评:个人信息,利用好更需保护好 2019-04-21
  • 山西临汾:壶口瀑布奔腾咆哮奇景 2019-04-21
  • 蔡徐坤粉丝破千万送福利 帅气运动装长腿吸睛 2019-04-17
  • 刘爽:走进世界舞台中央的中国新角色 2019-04-15
  • 西部网(陕西新闻网)www.cnwest.com 2019-04-15
  • 为太原人才新政点赞! 2019-04-07
  • 把每一元善款都用到实处 2019-04-07
  • 当你还在担心这些问题的时候,有个人的“自由发展”吗? 2019-03-31
  • 当前位置:上海天天彩4开奖结果 >  域名 >  正文 > 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

    上海时时乐开奖結果:在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.rl-f1.com/reg/

    发布时间:2019-06-16 13:46:37

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

    大马力美系车搞节油大赛?看凯迪拉克ATS-L到底哪来的底气 厨卫行业下一个风口在哪里? 甜叶菊批发基地在哪里? 野花组合中菊科花卉有哪些? 为什么聊微信时,有人会半夜两点去洗澡? 《打骂教不出好孩子》:Section2耐心对待孩子的“为什么” 仙草进南岳,怎么也得找个时间去看看 满月送什么礼物给好友比较好? ?天秤座男生喜欢什么样女人? Infor,能为中国企业数字化转型做什么? 【解读】什么是两化融合?两化融合的意义在哪里? 对外收购一个企业,应按什么流程来操作? 杨梅种子怎么种植最适合? 【杭州招聘】每天在看精彩的广告片中度过,你想体验这样的工作吗? 不到9万起,东风风神AX5 SUV性价比高吗? 你在意过你的眼皮吗? 上海激光祛斑哪里好上海祛斑机构单次电波拉皮整形会有副作用吗? 垂丝海棠适合四川地区吗? 浙江适合种植四季青草吗?

    编辑:密侯建

      文章推荐

      分类排行榜

      专栏文章

      更多>

      服务推荐

      上海天天彩4开奖结果
      塔柏好还是刺柏好? 扫一扫关注最新创业资讯
    • 置之无形之中听惊雷! 2019-06-11
    • 新疆铁路端午小长假加开41列旅客列车 2019-06-09
    • 说的有道理 。说明我们的教育方向确实是有问题,毛主席当年对教育领域的有关指示是正确的。 2019-06-09
    • 人民日报发喜报庆祝我国第一颗氢弹爆炸成功 2019-05-30
    • 96次航拍峨眉 换个角度看巴蜀名山 中国国家地理网 2019-05-30
    • 陈秋冬:评估AI项目 我们需要思考三个问题 2019-05-03
    • 浙江:大学生就业实习平台启用 2019-05-03
    • 人民日报人民时评:个人信息,利用好更需保护好 2019-04-21
    • 山西临汾:壶口瀑布奔腾咆哮奇景 2019-04-21
    • 蔡徐坤粉丝破千万送福利 帅气运动装长腿吸睛 2019-04-17
    • 刘爽:走进世界舞台中央的中国新角色 2019-04-15
    • 西部网(陕西新闻网)www.cnwest.com 2019-04-15
    • 为太原人才新政点赞! 2019-04-07
    • 把每一元善款都用到实处 2019-04-07
    • 当你还在担心这些问题的时候,有个人的“自由发展”吗? 2019-03-31