• 更加紧密团结在以习近平同志为核心的党中央周围  2019-05-21
  • 马拉维“红旗飘飘”十年间,中国工程印上了当地纸币 2019-05-21
  • 庆祝人民日报创刊70周年系列访谈之颜世贵 2019-05-15
  • 国产新型雷达芯片华睿2号与组网中心同时亮相 2019-05-15
  • VRAR从热转凉 追风上市公司“跌落神坛”追风上市公司“跌落神坛”-手机行情 2019-05-06
  • The GNU General Public License v3.0 2019-05-05
  • 第21届上海国际电影节启幕 设“一带一路电影周” 2019-04-11
  • 广西壮族自治区东兰县“七民一站一阵地工作法”维护群众权益 2019-04-08
  • 苗山脱贫影像志——父母在 不远行 2019-04-08
  • 竹编:缝隙里的乡愁文章中国国家地理网 2019-03-31
  • “几乎是时时在流血、天天有牺牲”,他们的故事你知道吗? 2019-03-31
  • 当前位置:浙江十一选五开奖直播 >  域名 >  正文 > 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-05-22 05:12:55

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

    高60公分月季今年什么价格? 金森女贞的批发行情怎么样? 求购月季小苗哪家好? 黄刺玫的价格表哪家最靠谱? 养鱼种植什么牧草? 哪里有卖苜蓿品种巨能? 草地早熟禾有哪些优点? 黑龙江哪里有卖大花金鸡菊种子? 红花草花别名叫什么? 狗尾草种子报价哪家最便宜? 六月还能种植紫花地丁吗? 蒲公英的花有几种色? 夏季能不能播种山丁子? 十一月还能种植蟠桃吗? 冬季沙藏的胡枝子种子多少钱? 九月还能种植合欢树吗? 美国松花语是什么? 甘肃哪里有卖艾草种子的? 马齿苋籽什么价格能买到?

    编辑:密侯建

      文章推荐

      分类排行榜

      专栏文章

      更多>

      服务推荐

      浙江十一选五开奖直播
      塔柏好还是刺柏好? 扫一扫关注最新创业资讯
    • 更加紧密团结在以习近平同志为核心的党中央周围  2019-05-21
    • 马拉维“红旗飘飘”十年间,中国工程印上了当地纸币 2019-05-21
    • 庆祝人民日报创刊70周年系列访谈之颜世贵 2019-05-15
    • 国产新型雷达芯片华睿2号与组网中心同时亮相 2019-05-15
    • VRAR从热转凉 追风上市公司“跌落神坛”追风上市公司“跌落神坛”-手机行情 2019-05-06
    • The GNU General Public License v3.0 2019-05-05
    • 第21届上海国际电影节启幕 设“一带一路电影周” 2019-04-11
    • 广西壮族自治区东兰县“七民一站一阵地工作法”维护群众权益 2019-04-08
    • 苗山脱贫影像志——父母在 不远行 2019-04-08
    • 竹编:缝隙里的乡愁文章中国国家地理网 2019-03-31
    • “几乎是时时在流血、天天有牺牲”,他们的故事你知道吗? 2019-03-31