#android #kotlin #retrofit2 #kotlin-coroutines #lazy-initialization
#Android #котлин #retrofit2 #kotlin-сопрограммы #отложенная инициализация #kotlin
Вопрос:
Привет, друзья, вот мой код, он является частью моего ProfileViewModel
, он используется двумя фрагментами, я хочу получить значение, когда оно полезно, потому что я использую эту ViewModel для двух фрагментов. итак, я не хочу инициализировать, когда не использую его, как я могу заархивировать его с помощью отложенной инициализации, здесь ответ — это ответ, возвращаемый модифицированным, здесь сопрограмма, запущенная в диспетчерах.Ввод-вывод, и ответ анализируется моей функцией makeApiCall
, он может обрабатывать успех и ошибку с помощью закрытого класса Result
, поэтому он вернет ответ, если он будет успешным, иначе null, ответ также можно наблюдать в соответствующем фрагменте с соответствующей функцией, ниже приведен мой код
val profile: ProfileModel by lazy { getProfile() }
init {
getProfile()
}
fun getProfile() {
Coroutines.io {
makeApiCall(
ProfileFragment.REQUEST_CODE_PROFILE
){
repository.getProfile()
}?.let { response ->
form.name.postValue(
response.profile.name
)
profile = response.profile
}
}
}
Комментарии:
1. Если вы хотите этого, почему бы просто не позвонить
getProfile()
, когда вам это нужно. Не вызывайте его вinit
блоке. Также не делегируйте свойство. Просто инициализируйте его или оставьте его нулевым. Вам должен потребоваться aLiveData
для получения обратного вызова состояния загрузки.2. я получил это из множества поисковых запросов в interner, наконец, обнаружил, что fun <T>lazyDeferred(блок: приостановить сопрограммирование.() -> T) : Lazy<Отложенный<T>>{ вернуть lazy { GlobalScope.async(start = CoroutineStart.LAZY){ block.invoke(this) } }} и теперь в моем коде val profile с помощью lazyDeferred { makeApiCall( ProfileFragment. REQUEST_CODE_PROFILE ){ repository.getProfile() }?.profile } и в моих сопрограммах фрагментов. main { binding.profile = ViewModel.profile. await() } спасибо @ADM