Android 返回结果和lateinit:尚未初始化属性执行
在我的android应用程序中,我只需要在完成长操作后返回Android 返回结果和lateinit:尚未初始化属性执行,android,kotlin-coroutines,Android,Kotlin Coroutines,在我的android应用程序中,我只需要在完成长操作后返回响应。可能是1秒或10秒后 片段: import kotlinx.coroutines.* import retrofit2.Response import java.util.* fun executeTraderOperation(traderOperation: Trader.Operation, base: String, quote: String): Response<Void> {
响应
。可能是1秒或10秒后
片段:
import kotlinx.coroutines.*
import retrofit2.Response
import java.util.*
fun executeTraderOperation(traderOperation: Trader.Operation, base: String, quote: String): Response<Void> {
lateinit var executions: Response<Void>
GlobalScope.launch(Dispatchers.IO) {
async {
executions = longOperation(traderOperation, base, quote)
}
}
return executions
}
附言
longOperation
-是一个长网络操作executeTraderOperation()
正在主应用程序线程上调用,这是由onClick()
提供的。然后,通过GlobalScope.launch(Dispatchers.IO)
,您可以在后台线程上运行一些代码。然后返回执行
,该执行尚未由后台线程上的代码初始化。。。因此,崩溃
将其改写为:
suspend fun executeTraderOperation(traderOperation: Trader.Operation, base: String, quote: String): Response<Void> = withContext(Dispatchers.IO) {
longOperation(traderOperation, base, quote)
}
(这假设AddTraderViewModel
是一个AndroidXViewModel
,并且您具有-ktx
依赖关系,从而为您提供viewModelScope
)这里是我的解决方案:
class AddTraderViewModel(application: Application) : AndroidViewModel(application) {
private val isShowProgressLiveData = MutableLiveData<Boolean>()
fun doClickStart(base: String, quote: String) {
GlobalScope.launch(Dispatchers.Main) {
val response = OperationFactory.executeTraderOperation2(Trader.Operation.CREATE, base, quote)
if (response.isSuccessful) { // Returns true if http code is in the range [200..300). */
isShowProgressLiveData.value = false
} else {
isShowProgressLiveData.value = false
}
}
}
}
class OperationFactory {
companion object {
suspend fun executeTraderOperation2(traderOperation: Trader.Operation, base: String, quote: String): Response<Void> = withContext(Dispatchers.IO) {
runOperation(traderOperation, base, quote)
}
suspend fun runOperation(traderOperation: Trader.Operation, base: String, quote: String): Response<Void> {
val executeTraderOperation = myRestClient.executeTraderOperation(some_param_here)
val response = executeTraderOperation.await()
return response
}
}
}
import kotlinx.coroutines.Deferred;
import retrofit2.Call;
import retrofit2.Response;
@GET("test/{my_operation}")
Deferred<Response<Void>> executeTraderOperation(some_param_here);
类AddTraderViewModel(应用程序:应用程序):AndroidViewModel(应用程序){
private val isShowProgressLiveData=MutableLiveData()
趣味doClickStart(基:字符串,引号:字符串){
GlobalScope.launch(Dispatchers.Main){
val response=OperationFactory.executeTraderOperation2(Trader.Operation.CREATE,base,quote)
if(response.issusccessful){//如果http代码在[200..300]范围内,则返回true*/
isShowProgressLiveData.value=false
}否则{
isShowProgressLiveData.value=false
}
}
}
}
等级经营工厂{
伴星{
suspend fun executeTraderOperation2(traderroperation:Trader.Operation,base:String,quote:String):Response=withContext(Dispatchers.IO){
运行操作(贸易、基础、报价)
}
suspend fun runOperation(traderroperation:Trader.Operation,base:String,quote:String):响应{
val executeTraderOperation=myRestClient.executeTraderOperation(此处有一些参数)
val response=executeTraderOperation.await()
返回响应
}
}
}
导入kotlinx.coroutines.Deferred;
2.电话;;
2.回应;;
@获取(“test/{my_operation}”)
延迟的executeTraderOperation(此处有一些参数);
现在工作正常。AddTraderViewModel从androidx.lifecycle.AndroidViewModel扩展而来。但我得到编译错误“viewModelScope-UnsolvedReference viewModelScope”@Alexei:确保您有
2.1.0-beta01
(或更新版本)属于androidx.lifecycle:lifecycle viewmodel ktx
作为依赖项。我认为viewModelScope
扩展属性在其中。
fun doClickStart() {
viewModelScope.launch(Dispatchers.Main) {
val response = longOperation(traderOperation, base, quote)
TODO("do something with response")
}
}
class AddTraderViewModel(application: Application) : AndroidViewModel(application) {
private val isShowProgressLiveData = MutableLiveData<Boolean>()
fun doClickStart(base: String, quote: String) {
GlobalScope.launch(Dispatchers.Main) {
val response = OperationFactory.executeTraderOperation2(Trader.Operation.CREATE, base, quote)
if (response.isSuccessful) { // Returns true if http code is in the range [200..300). */
isShowProgressLiveData.value = false
} else {
isShowProgressLiveData.value = false
}
}
}
}
class OperationFactory {
companion object {
suspend fun executeTraderOperation2(traderOperation: Trader.Operation, base: String, quote: String): Response<Void> = withContext(Dispatchers.IO) {
runOperation(traderOperation, base, quote)
}
suspend fun runOperation(traderOperation: Trader.Operation, base: String, quote: String): Response<Void> {
val executeTraderOperation = myRestClient.executeTraderOperation(some_param_here)
val response = executeTraderOperation.await()
return response
}
}
}
import kotlinx.coroutines.Deferred;
import retrofit2.Call;
import retrofit2.Response;
@GET("test/{my_operation}")
Deferred<Response<Void>> executeTraderOperation(some_param_here);