组件化思维
组件化关于各个领域都现已不是新鲜的词汇了,在Android上组件化现已遍地开花了,这儿仅仅记载一下我对组件化的了解,有不对的地方请咱们指出。
组件化是为了处理什接口卡么问题mvvm结构
优秀的工程项目应该满意高内聚低耦合思维,各个功用有明显的边界区分,各个模块各司其职,至少在修java初学正的时分不是牵一发而动全身,其他人在接手的时分也能快速了解。
假定你的项目存在一下问题,能够考虑运用组件化了:
- 代码耦合严峻,eventbus满天飞
- 依托严峻,编译慢
- 功用模块边界不清楚
- 多人开发的时分常常发生合并抵触
组件化的存在便是为了处理上述问题,将功用相关的作为一个独自模块,将常常运用的根底功用抽离出来作为根底模块,多人开发时每Java个人担枸杞任独立模块。
志向状态下,每个模块能进行独立开发、独立检验,在打包时合并为一个项目。
怎样运用组件化
大致分为以下进程:
- 处理依托问题
- 抽离共用模块
- 创立独立功用模块
- 模块间通讯
咱们的意图是建立MVVM形式下的组件化结构,关于组件化的理论知识咱们不宫颈癌做过多的介绍了。
参看:
www.jianshujava怎样读.com/p/5e20a6740…
/post/688111…
建立
处理依托问题
组件化分为宿主App+多module,假定每个moduel都运用自己的依托,那么处理起来恰当吃力,不同module之间依托的版别java难学吗不同、接口无权限晋公积金级都是问题,所以咱们首先寻求的便是一起依托处理
方接口是什么法一龚俊:
在根目录下创立config.gradle文件,这个文件便是处理常用装备和依托:
ext{
versions = [
compileSdkVersion: 29,
buildToolsVersion: "29.0.2",
minSmvvm规划形式dkVersion : 21,
targetSdkVersion : 29,
versionCode : 1,
versionName : "1.0"
]
// 组件化与集成化切java言语换时,设置不同的applicajava难学吗tionId
appId = [
app : "com.example.modular.todo",
shop: "com.example.modular.shop"
]
dependencies = [
appcompat : "androidx.appcompat:appco工商银行客服电话mpat:${appcompatVersion}",
constraintlayout: "androidx.constraintlayout:constraintlayout:${枸杞constraintlay龚俊outVersion}",
]
//这儿只做实例
}
然后再根目录的build.gradle中添加:
apply from: 'config.gradle'
在不Go同的module公积金模块中的引用:
// build.gradle
def supports = rootProject.ext.dependencies
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation supportsjava模拟器.appcompat
implementation supports.constraintlayout
// supports 依托
supports.each { key, value -> implementation value }
}
还有一种buildSrc处理,我并不常用这种方接口无权限法,更习气下面这种:协程app
毕竟结束办法接口自动化
1. 新建moduel模块,称号为vejava怎样读rsion
2. 将version模协程网块的build.gradle批改为如下:
bmvvm形式和mvc的差异uildscript {
ext.kotlin_version = "1.5.20"
repositories {
googmvvm和mvcle()
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotl接口是什么i接口无权限是什么意思n:kotlin-gradle-plugin:$kotlin_vers宫颈癌前期症状ion"
}
}协程教育
apply plugin: 'kotlin'
apply plugin: 'java-gradle-plugin'
rep协程网ositories {
google()
maGovenCentral(接口测验面试题)
}
dependencies {
impmvvm原理lementation gradleApi()
implementation "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
implementation "org.jetbrai宫崎骏ns.kotlin:kotlin-r协程efljava面试题ect:$kotlin_ver接口sion"
}
compjava工作培训班ileKotlin {
kotlinOptions {
jvmTarget = 1.8
}
}
compileTestKotlin {
kotlinOptions {
jvmTarget = 1.8
}
}
gradlePlugin {
plugins {
version {
// 在 app 模块需求经过 imvvm和mvc的差异d 引用这个插件 ,批改java工作培训班为version模块包名
id = 'com.xlu.version'
// 结束这个插件的类的途径
implementationClass = 'com.xlu.versmvvm形式ion.VersionPlugin'
}
}
}
在此模块下创立Ve接口无权限是什么意思rsionPlugin
类,如下:
import org.gradle.api.Plugin
impmvvm原理ort org.gradle.api.P接口测验roject
/**
* TODO 这儿什么都不用做,创立就行了
*/
class VersionPlugin : Plugin<Project>{
override fun apply(target: Project) {
}
}
3. 重要的一步:
- 翻开工程根目录下的
setting.gr协程电话adle
文件 - 删去本来的
include ':version'
- 批改为
includeBuild("version")
4. 在version模块下创立Dependency类,处理依托
当然这个类称号自己随意起,实例如下:
object Dependency {
object ProjectConfig {
const val compileSdkVersion =宫崎骏 30
const val b接口和抽象类的差异uildToolsVer接口是什么sion = "30.0.1"
cons工商银行客服电话t val applicationId = "com.example宫颈癌前期症状.mvvm_develop"
consjavascriptt val minSdkVe枸杞rsion = 16
const va协程客服电话l targetSdkVersion = 30
const val versionCode = 1
const val ver协程游览sionName = "1.0"
const val isAppMode = false
}
object Version{
// Andrjava面试题oid---------------------------------------------------------------
const val Junitjavascript = "4.13"
const val Material = "1.2.0" // 资料规划UI套件
// AndroidX--------------------------------------------------------------
const val AppCompat = "1.2.0"
const val CoreKtx = "1.3.1"
const val Co协程教育nmvvm结构straintLayout = "2.0.1" // 约束布局
const vamvvm原理l TestExtJunit = "1.1.2"
cjava面试题onst val TestEspresso = "3.3.0"
const val ActivityKtx = "1.1.0"
const val FragmentKtx = "1.2.5"
const val MultiDex =java言语 "2.0.1"
/宫颈癌前期症状/ Kotlin--------------------------------------java模拟器------mvvm原理面试-----------------mvvm和mvc---
const val Kotlin = "1.5协程客服电话.10"
const val Coroutines = "1.5.0" // 协程
// JetPack----------协程教育-----------------------------------------------------
const val Lifecycle = "2.3.1" // Lifecycle相关(ViewModel & LiveData & Lifecycle)
const val Hilt = "2.35.1" //狗狗币 DI结构-Hil协程机票t
consmvvm原理面试t val HiltAndroidx = "1.0.0"
}
object DependencyImp{
//Android
const val Jjava言语unit = "junit:junit:${Version.Junit}"
const val Material = "com.google.android.material:material:${V协程教育ersion.Material}"
//AndroidX
const val AndroidJUnitRunner = "androidx.te接口无权限st.runner.An工商银行客服电话droidJUnitRunner"
const val AppCompat = "androidx.ap接口类型pcompat:appcompat:${Version.AppCompat}"
const val CoreKt接口无权限x = "androidx.core:core-ktx:协程客服电话${Version.CoreKtx}"
const val ConstraintLayout = "androidx.constraintlayout:constraintlayout:${Version.ConstraintLayout}"
const val TestExtJunit = "androidx.test.ext:junit:${Version.TestExtJunit}"
const val TestEspresso = "androidx.test.espresso:espresso-core:${Version.Te接口类型stEspresso}"
const val ActivGoityKtx = "androidx.acti接口类型vity:activity工商银行-ktx:${Version.ActivityKtx}"
const val FragmentKtx = "androidx.fragment:frmvvm和mvcagment-ktx:${Versijava难学吗on.Frag接口无权限是什么意思mentKtx}"
const val MultiDex = "androidx.multid龚俊ex:multidex:${Version.MultiDex}"
//Kotlin
const val Kotlin = "org.jetbrains.kotlin:kotlin-stdlib:${Version.Kotlin}"
const val CoroutinesCore = "org.jetbrains.javaapi中文在线看kotlinx:kotlinx-coroutines-core:${Version.Coroutines}"
const valmvvm原理面试 CoroutinesAndroid = "org.jetbrains.kotlinx:kotlinx-coroutines-android:${Version.Coroutines}"
//Jetpack
const val ViewModel = "a接口测验ndroidx.lifJavaecycle:lifjavaapi中文在线看ecycle-viewmodel-ktx:${Version.协程之窗Lifecycle}"
const val ViewModelSavedState = "androidx.lifecy接口无权限是什么意思cle:lifecycl协程教育e-viewmodel-savedstate:${Version.Lifecycle}"
const val接口无权限是什么意思 LiveData = "androidx.lifecycle:lifecycle-livedata-ktx:${Version.Lifecycle}"
const接口测验 v接口类型al Lifecycle = "androidx.lifecycle:lifecyc工商银行le-runt协程 线程ime-ktx:$宫颈癌{Version.Lifecyc龚俊le}"
const val LifecycleCompilerAPT = "androidx.lifecycle:lifecycle-compiler:${Version.Lifecycle}"
const val HiltCore = "com.google.dagger:hilt-协程电话android:${协程教育Version.Hilt}"
const v接口是什么al HiltApt = "com.google.dagger:Javahilt-compiler:${Version.工商银行客服电话Hilt}"
const val HiltAndroidx = "androidx.hilt:hilt-compiler:${Version.HiltAndroidx}"
}
}
上面代码应该很好了解吧,咱们在上述创立好咱们常用的依托之后,就能够在其他modue中引用了。
上面类中的java初学依托在编译时并不会创立,只需在module中引用才会创立。
5. 其它module中运用
咱们以宿主app模块为例,翻开app模块的build.gradle文件
//setup1
import com.example.plugin.Dependen接口crc过错计数cy
// setup2
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'com.example.plugin' // 留接口无权限心这儿哦,否则上述的协程机票import会报错
}
一些装备根底:
android {
compileSdkVersion Dependency.ProjectConfig.co协程游览mpileSdkVersion
buildToolsVersion Dependency.ProjectConfig.buildToolsVersion
defaultConfigjava面试题 {
applicationId Dependency.ProjectCmvvm和mvc的差异onfig.applicationId
m协程机票inSdkVersion Dependency.ProjectConfig.minSdkVersion
targetSdkVersion Dependjava开发ency.ProjectConfig.targetSdkVersion
versionCode Dependency.ProjectConfig接口和抽象类的差异.versionCode
versionName协程官网 Dependency.ProjectConfig.versionName
testInstrumentationRunjava模拟器ner "androidx.testjava初学.runner.AndroidJUnitRunner"
}
......
}
依托处理:
dependencies {
testImplementati协程 线程on 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
//Android
api Dependency.DependencyImp.AppCompat
api Djava面试题ependency.DependenjavascriptcyImp.Material
api Dependency.DependencyImp.Androimvvm原理面试dXLeagcy
api Dependenc接口y.DependencyImp.Acjava面试题tivityKtx
api Dependency.DependencyImp.FragmentKtx
api Dependency.DependencyImp.MultiDex
//Kotjava初学lin
api Dependency.DependencyImp.Kotlin
api Dependency.DependencyImp.CoreKtx
//Kotlin协程中心库
api Dependency.DependencyImp.CoroutinesCore
api Dependency.DependencyImp.工商银行CoroutinesAndroid
//navigation
api Dependency.Dependen协程官网cyImp.NavigationFragment
api Dependency.DependencyImp.NavigationUI
//lifecycle
api Dependency.DependencyImp.Lifecycle
ap协程教育i Dependency.Dependen宫颈癌前期症状cyImp.Livedata
api Dependency.DependencyImp.Viewmod枸杞el
}
详细参看Demo
上面能够看到咱们用Dependency.ProjectConfig.xx这种办法替代了本来的数据,在Dependejava怎样读ncy接口无权限类中一起处理
留神version地址的方javascript位应该与协程 线程Project处于同一层级,而不是与app module处于同一接口测验层级:
否则M工商银行akeProjectk可能会报错:
Project directory 'C:xxxve接口crc过错计数rsion' is not part of the build defined by settings file 'C:xxxprojectsettings.gradle'.
If this is an unrelated build, it must have itjava初学s own settings file.
setting.gradle装备如下:
include ':module_home'接口卡
include ':modul协程e_login'
inc狗狗币lude ':base'
injavaapi中文在线看clude ':app'
includeBuild "javaapi中文在线看../version"
rootProject.name = "mvvm_develop"
详细参看Demo
我这边晋级了2020.03版别协程appAndroidStudio,用的kotlin1.5.20, Gradle Version 7.0.2,上述有些运用jcenter的依托需求留神下,新版AS已近完全扔掉了Jcenter
以上就结束了组件化的装备
参看资料:
blog.csdn.net/yubo_725协程 线程/ar…
抽离枸杞共枸杞用模块
有些功用是悉数模块能共用的,比枸杞如:
- 网络请求
- 图片加载
- 文件操作
- 权限操作
- 网页加载
这些模块一般不会去改动,和事务没有相关,可是悉数模块都能共协程官网用,咱们能够将其封装在base根底module中。
假定想将这个模块应用到多个项目协程 线程上,能够独自发在接口无权限是什么意思公司的m宫崎骏aven仓库中,也能够运mvvm和mvc的差异用jitpamvvm原理面试ck
上传到mavejava初学n能够参看:blog.csdn.net/wang2956896…
怎样将独自的module发布到jitpack,参看:www.jianshu.c接口是什么om/p/b7552cf89…
模块间通讯
咱们这儿运用ARoumvvm原理面试ter进行模块间的通讯,对ARouter了解的同学就能够直接跳过了
根底接入:
在同一依协程教育托枸杞处理中装备好:接口是什么
const val ARout协程机票e = "1.5.2" // 阿里路由
const val ARouteCompiler = "1.5.2" // 阿里路由 APT
const val ARoute = "com.alibaba:arouter-api:${Version.ARoute}"
const va协程电话l ARouteCompiler = "com.alibaba:arouter-compiler:${Version.ARouteCompiler}"
然后需求在悉数运用了ARouter的模块中进行协程机票装备,留神java版别和kotlin有些不一样:google
Java:
defaultConfig {
...
javaCompileOptions {
annotationProcessorOption工商银行s {
arguments = [AROUTER_MODULE_NA协程游览ME: project.getName()]
}
}
}
dependencies {
...
implementation Dependency.DependencyImp.ARoute
annjava开发otationProcessor Dependency.Depe接口无权限ndencyImp.ARouteCompiler
}
Kotlin:
defaultConfig {
...
kapt {
arguments {
arg("AROUTER_MODULE_龚俊NAME", project.getName())
}
}
}
dependencies {
...
implementation Dependency.DependencyImp.ARoute
kapt Djava面试题epen协程dency.DependJavaencyImp.ARouteCompiler
}
在公共模块中一起协程官网处理途径,我这儿创立了一个Constants类去同一处理途径:
object ARouterConstant {
const val MainAct龚俊ivity = "/app/MainActivity"
const val ARouterFragment = "/app/ARouterFragm协程网ent"
const val L接口无权限oginActivity = "/login/LoginActivity"
}
留神javascript途径至少需求两级,主张运用/module name/class name
这姿势装备
页面跳转
在activity上或许fragment上装备:
@Route(path = ARouterCons接口卡tanjava面试题t.LoginActivity)
class LoginActivity : BaseActivity(R.layout.actijava开发vity_login) {
}
@Route(path = ARouterConstant.ARouterFragment)
class ARouterFragment : BaseFragment(R.lajava怎样读yout.fragment_arouter) {
}
基java怎样读础跳转:
//跳转到Login模块 -> LoginActivity
ARouter.getInstance().build(ARouterConstant.LoginActivity).navmvvm形式igation()
带着参数跳转接口是什么:
ARouter.getInstance().build(ConstantARouter.LoginActivity)
.withLong(ConstantParams.key1, 666L)
.withString(Cojava言语nstant接口卡Params.kmvvm形式和mvc的差异ey2, "888")
.navigation()
在意图页面获取参数:
private fun initParams() {
val key1 = intent?.getLongExtra(ConstantParams.key1,0L)
val key2 = intent?.getS宫颈癌tringExtra(ConstantParams.keyjava初学2java工作培训班)
}
能够运用@Autowirejava开发d
注解自动注入,如下:
@Autowired
@JvmField var key1 : Long = 0L
@Autowired(枸杞name = Cjava面试题onstantmvvm原理面试Params.key2)
@JvmField var test : String = ""
overjava模拟器ride fun initData(savedInstanceState: Bundle?) {
// Start auto inject.
ARouter.getInstance().inject(this)
}
运用
@Autowired
注解的时分需求合作@JVMField
运用,在初始化的时分调用ARouter.getInstamvvm和mvc的差异ncejava难学吗().inject(this)
假定需求传递自定协程机票义方针,能够结束Serizable接口:
咱们自定义一个数据bean:
data class RouterBeanSeriali协程网zablejava怎样读(val id:Int, val name:StringGo):Serializable
传递:
ARouter.getIns协程apptance()
.build(ConstantARouter.LoginActivity)
.withSerializable(ConstantParams.keMVVMy3,RouterBeanSerializable(id = 123,name = "哈哈哈哈"))
.navigation()
获取:
val key3 = intent?.getSerializableExtra(ConstantParams.key3)
输出成果:
key3:RouterBeanSe协程rializa接口是什么ble(id=123, name=哈哈哈java工作培训班哈)
关于没有结束序列化接口的方针,官方供给了withObject接口,我感觉没必要,有喜爱的能够参看这篇文java难学吗章
ARouter获取Fragment实例:
ARouter是不支持fragment跳转的,只能获取fragment实例:
val fragment: Fragment = ARouter.getInstance().build(C协程机票onstantARouter.ARouterFragment)
.withLong("id", key1)
.withString("name", test)
.navigation() a接口crc过错计数s Fragment
更多关于更多ARouter的用法便不再论述,请检查官方文档,我在Demo中也有进行演示
数据通讯
上面协程app介绍了运用ARouter进行页面跳转,和简略接口类型的页面间数据传递。假定咱们不进行页面跳转,多module间有哪些数据通讯的办法?
进行数据通讯的办法有EventBus,数据耐久化,进程间通讯。大多不适用于咱们的场景,我这mvvm原理面试儿选用的是大佬举荐的向外暴露接口的办法。
咱们新建common module
,这个module主要是供给事务相google关公积金的公共依托,咱们在这狗狗币儿结束数据接口类型接口调用。
咱们让common module运用api project(path: ':base')
这样其他模块只需求依托一个协程appcommon就接口自动化行了
这样做的长处是阻隔每个module,不用接口测验使各个module之间彼此依mvvm结构托才调调用对方的服务
这儿以login module
为例,供给获取用户信息的接口,先狗狗币创立LoginInterfa接口无权限是什么意思ce
接口:
interface LoginInterface {
f协程客服电话un getToken():String
fun getUsgoogleerName():String
fun getUserID():Int
}
ARoutjava初学er
中供给了IProvider
接口服务,咱们需求让自定义接口继承IP接口测验rovider
接口。
interface LoginInterface : IProvider
接下来只需求在login mod接口是什么ule
中完协程电话结此接口就行了:
这儿仅仅一些模接口无权限仿数据
class LoginImpl : Loginmvvm原理Intermvvm和mvc的差异face {java开发
override fun init(context: Context?) {
//此办法为IProvijavaapi中文在线看der接口供给
}
overridemvvm的了解 fun getToken(): Str接口是什么ing {
return "this is login token"
}
override fun getUserName(): String {
return "nammvvm原理面试e"
}
override fun getUserID(): Int {
return 123
}
}
咱们能够创立一个东西类工商银行去一起处理工商银行客服电话:
object LoginUtil {
fun getLoginServer():LoginInterface{
return ARouterjava言语.getInstanc接口自动化e().navmvvm规划形式igation(LoginInterface::class.java)//假定只需一个结束枸杞,这种办法也能够
//return ARouter.getInstance().build(ConstantARouter.L枸杞oginItfImpl).navigation() as LoginInterface
}
}
在其他module中调用:
val token:String = getLoginServer().getToken()
到此咱们初步结束了组件化的建立,更多运用的坑咱们自行探究吧哈哈哈哈
参看:
/post/688111…
/post/684490…
/post/684490…
上面三篇文章javaapi中文在线看都挺值得咱们参看的,感谢java开发大佬们的支付
关于一些古怪的问题
Moduel独立调试
moduel独立调试的时分需求设置不同的mainfest.xml文件,还要javascript装备applicationId。
进程如下:
1. 在Version模块中装备参数
object Dependency {
//是否协程客服电话容许module独立容许
object RunAlone{
const val base = false
const val home = true //以home独立容许为例接口类型
const val login = false
conmvvm的了解st val jitpack = false
}
....
}
2.在home mmvvm原理面试oduel中新建Mainfest.xml文件
作为独立app的Mainfest文件个作为module的java初学Mainfest文件是不一样的,咱们需求创立两个
3.装备mdule_home的build.gradle文件
imp协程网ort com.xlu.version.Dependency
plugins {
id 'com.xlu.version'
}
//setup1:
if (Dependency.RunAlone.home.toBoolean()) {
apply plugin: 'com.android.app宫颈癌lication'
} else {
apply pl协程官网ugin: '狗狗币com.android.library'
}
apply plugin: 'kotlin接口crc过错计数-android'
apply plugin: 'kotlin-kapt'
android {
compileSdkVe接口无权限rsion D协程机票ependency.ProjectConfig.compileSdkVersion
buildToolsVersion Dependency.ProjectConfig.buildToolsMVVMVersion
defaultConfig {
//setup2:作为独立app需求装备applMVVMicationId
ifmvvm原理面试 (Dependency.RunAlone.home.toBoolean()) {
applicationI协程d Depend协程网ency.Proje龚俊ctConfig.applicationId_home
}
......
}
......
//setup3:
so接口crc过错计数urceSets {
main {
// 独立调试与集成调试时运java面试题用不同的 AndroidManifest.xml 文件
if (Depend接口卡ency.RunAlone.home.toBoolean()) {
manifest接口.srcFile 'src/main/manifest/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
}
}
}
}
dependencies {java初学
implementation project(path: ':mvvm原理面试base')
}
上述3步现已标明晰该怎样装备。
Application生命周期
咱们通常在Application中履行一些初始化操作,比方sdk初始协程机票化。但接口测验面试题是只需能独立运转的module才调具有Application
假定咱们将悉数的初始化操作都办法在app application中,就会构成每次子module引mvvm形式和mvc的差异入新的库都需求批改app module,有没有办法让子module自己履行初始化。
办法一:
反射结束,参看:/post/684490…
办法二
生命周期分发,参看:
www.jianshu.com/p/59368ce8b…
juejin.cJavan/po枸杞st协程 线程/688111…
办法三:
咱们上面提到了其他module想外暴露服务,选用面向接口编程的办法,其他模块不能规划详细的结束类,咱们在这儿相同能够学习,Google供给了AutoSerive服务,一个简略的接口自动化例java言语子:
新建一个接口:
interface Display{
fun show()
}
有许多的类结束了Display接口:
class phone :Diaplay接口自动化{
override fun s接口无权限how(){
/接口测验/show pho工商银行ne
}
}
class monitor :Diaplay{
override fun s接口crc过错计数how(){
//sho公积金w m工商银行onitor
}
}
咱们需求在悉数的结束类上加上注解:@AutoService(Display::cl接口是什么ass)
咱们能够用过ServiceLoader加载出此接口悉数的结束类
val mLoader: ServiceLoader<Display> = S工商银行客服电话erviceLoader.load(Display::class.java)
mLoader.forEach {
it.sh协程ow()
}
便是这么的简略,咱们能够经过@AutoServi接口类型ce来结束,这个咱们的application初始化有什么关系呢?
- 创立相关接口:
interf协程appace ApplicationLifecycle {
fun onAtta宫崎骏chBaseContext(context: Context)
fun on协程教育Creatmvvm形式和mvc的差异e(applicatio协程游览n: Appjava怎样读licatigoogleon)
fun onT协程之窗erminate(application: Application)
fun init()
}
- 创立一个协程教育署理接口测验类来结束此接口:
//留神这儿不需求注解@AutoService
class LoadModuleProxy : ApplicatiojavascriptnLifecycle {
private var mLoader: Servicejava模拟器Loader<Applic狗狗币ationLifecycle&mvvm形式gt; =
ServiceLoader.load(ApplicationLifecycle::class.java)
override fun onAttachBaseContext(context: Context) {
mLoader.forEach {
Log.d("ApplicationInit", it.toStrin接口g())
imvvm形式t.onAttachBas接口卡eContext协程之窗(context)
}
}
overmvvm规划形式ride fun onCreate(application: Application) {
mLoader.forEach { it.onCreate(application) }
}
override fun onTergoogleminate(application: Application) {
mLoader.forEach { it.onTerminate(application) }
}
override fun init(){
mLoader.f龚俊orEach { it.in接口测验it() }
}
}
- 在BaseApplication中注册:
open class Basemvvm和mvcApp :Application() {
private val mLo协程客服电话adModuleProxy by l接口无权限是什么意思azy(mode = LazyThreadSafetjava难学吗yMode.NONE) { LoadModu接口leProxy() }
companion object{
private lateinit var baseApplication: BaseApp
fun getContext():宫崎骏 Context {
return baseApplication
}
}
override fun attachBaseContemvvm原理面试xt(b接口crc过错计数ase: Context) {
super.attachBaseContext(base)
mLoadModuleProxy.onAttachBaseContext(basjavascripte)
}
override fun onCreate()协程之窗 {
super.onCreate()
baseApplication = this
mLoadMod宫颈癌前期症状uleProxymvvm规划形式.onCreate(this)
}
override fun omvvm规划形式nTerminate() {
super.onTe协程机票rminate()
mLoadModuleProxy.onTerminate(googlethis)
}
}
- 在子modjava怎样读uel中Application中结束ApplicationLifecycle接口
@AutoService(Apjava工作培训班plicationLifecycle::class)
class AppHome : ApplicationLifecycle {
private val TAG = "AppHome"
override fun onAttachBaseContext(context: Context) {
}
override fun onCreate(application: Application) {
}
override fun onTerminate(application: Application) {java初学
}
ov工商银行erride fu协程之窗n init(){
initSdkWorker()
initSdkMain()
}
private fun initSdkWorker() {
xLog.d(TAG, "initSdkWorker: ")
}
private fun ini接口无权限tSdkMain() {
xLog.d(TAG, "initSdkMa公积金in: ")
}
}
以上就能够完java言语结子module自己愉快的玩耍了协程 线程,AutoService运用参看:www接口无权限.jianshu.com/p/086fe0918…
以上代码协程官网都在mvvm_develop中能够找到,文章中为了简化协程机票省掉了一些东西,Demo中有完好的代码。本来mvvm和mvc的差异上星期就应该搞完的,咕咕咕到了现在协程,项目全体还在完善中,下一步是引进JetPack组件和一些东西来协助开发,欢迎大佬们指点。