【发布时间】:2019-07-14 11:58:45
【问题描述】:
我正在尝试通过viewModelScope.launch() 调用暂停的方法,但一旦调用该方法,应用就会崩溃。
我应该指出我正在使用最新版本的 androidX 稳定库。
然而,对于 ViewModel 和 LiveData,我使用的是 2.2.0-alpha02 的 alpha 版本。
当然,Retrofit 版本是2.6.0,所以将其功能标记为暂停应该没问题。
此外,变量是使用 Koin 初始化的。
日志:
java.lang.NoSuchMethodError: No virtual method getTag(Ljava/lang/String;)Ljava/lang/Object; in class Landroidx/lifecycle/ViewModel; or its super classes (declaration of 'androidx.lifecycle.ViewModel' appears in /data/app/co.nilin.varabank-lUNWj0JGUm_fCoYkMmbbJg==/base.apk)
at androidx.lifecycle.ViewModelKt.getViewModelScope(ViewModel.kt:36)
at co.nilin.varabank.home.HomeViewModel.fetchRates(HomeViewModel.kt:18)
at co.nilin.varabank.home.HomeActivity$init$2.onClick(HomeActivity.kt:27)
at android.view.View.performClick(View.java:6597)
at android.view.View.performClickInternal(View.java:6574)
at android.view.View.access$3100(View.java:778)
at android.view.View$PerformClick.run(View.java:25885)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
改造网络服务:
interface BankCalculatorWebService {
@GET("auto/bank-gateway/general/{bank}/currencies")
suspend fun fetchCurrencyRates(@Path("bank") bank: String): Response<CurrencyRateResponse>
}
存储库:
class BankCalculatorRepositoryImpl(
private val webService: BankCalculatorWebService
) : BankCalculatorRepository {
override suspend fun fetchRates(): List<CurrencyRateDTO> {
val list = ArrayList<CurrencyRateDTO>()
val response = webService.fetchCurrencyRates(Bank.getDefaultBank().swiftCode)
response.ifSuccessful { response ->
response.items.forEach {
list.add(CurrencyRateDTO.fromCurrencyRate(it))
}
}
return list
}
}
查看模型:
class HomeViewModel(
private val repository: BankCalculatorRepository
) : ViewModel() {
val rates = MutableLiveData<List<CurrencyRateDTO>>()
fun fetchRates() {
viewModelScope.launch {
val response = repository.fetchRates()
rates.postValue(response)
}
}
}
活动内的代码
viewModel.rates.observe(this) {
Toast.makeText(this, it.size, Toast.LENGTH_SHORT).show()
}
button.setOnClickListener {
viewModel.fetchRates()
}
【问题讨论】:
-
Jetpack 库中的版本似乎不匹配
-
@EpicPandaForce 是的,看我的回答
标签: android kotlin androidx android-viewmodel kotlin-coroutines