Android 基本片段中的句柄Koin(模块已加载错误)
我有一个碱基片段和另外两个片段,比如片段一,片段二,它们延伸了碱基片段Android 基本片段中的句柄Koin(模块已加载错误),android,kotlin,dependency-injection,koin,Android,Kotlin,Dependency Injection,Koin,我有一个碱基片段和另外两个片段,比如片段一,片段二,它们延伸了碱基片段 abstract class BaseFragment(): Fragment(){ init{ loadKoinModules(listOf(sampleModules)) } override fun onDestroyView() { super.onDestroyView() unloadKoinModules(listOf(sampleMod
abstract class BaseFragment(): Fragment(){
init{
loadKoinModules(listOf(sampleModules))
}
override fun onDestroyView() {
super.onDestroyView()
unloadKoinModules(listOf(sampleModules))
}
}
当我降落在fragmentOne上时,koin模块已加载,一切正常。我从fragmentOne导航到fragmentTwo,在unloadKoinModules之前再次调用loadKoinModules。我认为fragmentOne中加载的模块仍然存在,并且在加载fragmentOne中的模块之前不会被删除。加载和卸载koin模块的正确方式或生命周期是什么
module 'org.koin.core.module.Module@87380fe' already loaded!
module 'org.koin.core.module.Module@cef805f' already loaded!
快把它修好
没有办法解决这个问题,因为首先调用init
,然后调用Fragment2的onCreateView
,然后调用Fragment1的onDestroyView
(并不总是调用它,这取决于Fragment2如何引入到片段堆栈中)
就我个人而言,我会从片段中删除模块加载。但我不知道你为什么要把它们卸下来
稍微好一点的方法
我首先想到的是:
活动的类李>
在这个类的内部,从onCreate
加载模块李>
显示所需的片段,在此活动的后堆栈中上下导航李>
调用活动#onDestroy
时-卸载模块
如何做得更好?(如果可以移除卸载)
首先,确保确实要卸载这些模块。为什么不装一次就走呢?你认为合适的时候自己决定
Koin模块只能加载一次。一旦加载,这些模块将在整个应用程序中可用。这意味着您不能两次加载同一个模块-不需要它
在Koin的官方示例中,有一个是专门针对Android的:
class MyApplication : Application() {
override fun onCreate(){
super.onCreate()
// start Koin!
startKoin {
// declare used Android context
androidContext(this@MyApplication)
// declare modules
modules(myModule)
}
}
}
正如我们所看到的,模块是从应用程序
类加载的。应用程序运行时,只能有一个应用程序
类的有效实例。这意味着onCreate
不会被调用两次,因此从Application#onCreate
加载模块是安全的
或者,您可以从活动
类的onCreate
加载模块,如上所述但请注意,活动可以在应用程序的生命周期中多次重新创建。我仍在学习Koin,您的解释非常好。卸载模块是否会提高应用程序性能?我的想法是只加载我需要的东西,然后卸载它们以节省内存。如果我错了,或者这没有太大影响,也许我应该加载应用程序类中的所有内容,并将其保留。“卸载不需要的koin模块可以提高应用程序性能”——它可以。取决于模块的大小。在任何情况下,它都会释放一些内存。你的意图实际上是一个好的意图,但我认为如果你的应用程序很小或没有利用很多可用资源,这是一个开销。少数模块不会影响性能。如果模块很少使用和/或创建成本低,并且我需要额外的内存,我会卸载模块。如果你需要下载几兆字节的数据才能将模块存储在Koin中,你不应该删除它,IMHO。每个案例都应该研究。感谢您的澄清,我会根据需要重新设计我的应用程序。
class MyActivity: Activity {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
loadKoinModules(listOf(sampleModules))
// load the first fragment
}
override fun onDestroy() {
super.onDestroy()
unloadKoinModules(listOf(sampleModules))
}
}
class MyApplication : Application() {
override fun onCreate(){
super.onCreate()
// start Koin!
startKoin {
// declare used Android context
androidContext(this@MyApplication)
// declare modules
modules(myModule)
}
}
}