Что такое синглтон?
Шаблон Singleton в Android
Единственный экземпляр класса, обеспечивающий глобальную точку доступа к самому себе в течение всего времени существования приложения.
Аннотация @Singleton в Dagger
Один экземпляр класса, который уникален для определенного компонента, его доступ ограничен областью действия компонента.
Назначение синглтона
Чтобы предоставить единственный экземпляр класса в графе зависимостей (компонент). компонент обычно инициализируется на уровне приложения, поскольку он выполняет только компоненты в течение всего времени существования приложения и доступен для всех действий и фрагментов.
Возьмем пример:
CoffeeComponent.kt
@Singleton
@Component
interface CoffeeComponent {
fun getCoffeeMaker():CoffeeMaker
fun inject(activityA: ActivityA)
fun inject(activityB: ActivityB)
}
CoffeeMaker.kt
@Singleton
class CoffeeMaker @Inject constructor()
CoffeeAplication.kt
class CoffeeApplication : Application() {
private val component by lazy {
DaggerCoffeeComponent.builder().build()
}
fun getAppComponent(): CoffeeComponent = component
}
Рекомендуемая практика
Всегда идите на ленивую инициализацию вашего компонента.
Сценарий: скажем, вы - команда, решившая добавить экран подключения / обучения или включить какой-либо другой дизайн, который не требует компонента во время начальных экранов, это поможет минимизировать запуск задерживать. Всегда помните, инициализация компонента стоит дорого.
ActivityA.kt
import dagger.Lazy
class ActivityA: AppCompatActivity() {
@Inject
lateinit var coffeeMaker1:Lazy<CoffeeMaker>
@Inject
lateinit var coffeeMaker2:Lazy<CoffeeMaker>
private val component by lazy {
(application as CoffeeApplication).getAppComponent()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btn_activityB.setOnClickListener { startActivity(Intent(this, NewActivity::class.java)) }
component.inject(this)
println("Activity A CoffeeMaker 1 - ${coffeeMaker1.get()}")
println("Activity A CoffeeMaker 2 - ${coffeeMaker2.get()}")
}
}
Если ваш класс дорого строить, используйте ленивую инициализацию кинжала, пожалуйста, не путайте ее с ленивой kotlin. Вы должны импортировать
import dagger.Lazy
@Inject
lateinit var coffeeMaker1:Lazy<CoffeeMaker>
ActivityB.kt
class ActivityB: AppCompatActivity() {
@Inject
lateinit var coffeeMaker1:Lazy<CoffeeMaker>
@Inject
lateinit var coffeeMaker2:Lazy<CoffeeMaker>
private val component by lazy {
(application as CoffeeApplication).getAppComponent() }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_new)
component.inject(this)
println("Activity B CoffeeMaker 1 - ${coffeeMaker1.get()}")
println("Activity B CoffeeMaker 2 - ${coffeeMaker2.get()}")
}
}
вы получите вывод журнала как
Примечание.
If you want to share a singleton instance between activities, lazily initialize them in the application level, if you initialize them in an activity you will end up with different instance as the components are different
person
Extremis II
schedule
19.07.2019
@Injected
. Действительно ли мы используем@Inject
как в конструкторе, так и в классе, в котором вы хотите его создать? - person Ethan_AI   schedule 22.02.2016