Android 返回结果和lateinit:尚未初始化属性执行

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> {

在我的android应用程序中,我只需要在完成长操作后返回
响应
。可能是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
是一个AndroidX
ViewModel
,并且您具有
-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);