Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Kotlin-将ksoap2作为协同程序运行与异步运行-哪个更好?_Android_Kotlin_Async Await_Android Ksoap2 - Fatal编程技术网

Android Kotlin-将ksoap2作为协同程序运行与异步运行-哪个更好?

Android Kotlin-将ksoap2作为协同程序运行与异步运行-哪个更好?,android,kotlin,async-await,android-ksoap2,Android,Kotlin,Async Await,Android Ksoap2,这里是Android和Kotlin noob——我有一个叫做SOAP web服务的应用程序。现在,调用是使用线程进行的,通信正在工作。我想把它转移到Kotlin协同程序或Android异步任务上,我的问题是——在这种情况下,哪一个更好 我试着基于本文创建一个协同路由调用 ,基本上适应了这种模式: fun main() = runBlocking { val deferredResult = async { delay(1000L) "World!"

这里是Android和Kotlin noob——我有一个叫做SOAP web服务的应用程序。现在,调用是使用线程进行的,通信正在工作。我想把它转移到Kotlin协同程序或Android异步任务上,我的问题是——在这种情况下,哪一个更好

我试着基于本文创建一个协同路由调用 ,基本上适应了这种模式:

fun main() = runBlocking {
    val deferredResult = async {
        delay(1000L)
        "World!"
    }
    println("Hello, ${deferredResult.await()}")
}
当我将web服务调用放入coroutine async中时,Android Studio会突出显示HttpTransportSE调用方法(),并显示以下警告:

不适当的阻塞方法调用。报告在不应阻止线程的代码片段中找到的线程阻止方法调用“

我对这条消息的理解是,HttpTransportSE发出的调用阻塞了线程,因此我们失去了使用协同路由的优势,我应该坚持异步任务。 这种解释正确吗,或者有没有一种方法可以用协同程序来包装调用,从而更有效地工作

下面是我的代码(它与web服务通信,但由于警告,我觉得这不是一种正确的方法):

fun callWebService(
...
):字符串{
val defferedResult:Deferred=GlobalScope.async{
试一试{
...
val信封=SoapSerializationEnvelope(SoapEnvelope.VER12)
...
val androidHttpTransport=HttpTransportSE(URL)
androidHttpTransport.debug=true
androidHttpTransport.call(“$NAMESPACE/$methodName”,信封)//这就是我得到警告的地方
val resultData=envelope.response
webResponse=“$resultData”
...
}
return@async网络响应
}
返回runBlocking{defferedResult.await()}
}

多亏了这个
它可以归结为使用
Dispatchers.IO在后台运行
SOAP调用可以是常规函数,不需要进行微分等

我使用的是带有存储库的MVVM模型,因此所有的后台工作都在
存储库
级别上进行,由在相应的
视图模型
中启动的
片段
中的按钮触发,范围有限

我的SOAP调用现在看起来像这样

fun callWebService(...): String {
        try {
...
            val envelope = SoapSerializationEnvelope(SoapEnvelope.VER12)
...
            val androidHttpTransport = HttpTransportSE(URL)
            androidHttpTransport.debug = true
            androidHttpTransport.call("$NAMESPACE/$methodName", envelope)    
            val resultData = envelope.response
            webResponse = "$resultData"
...
        }
        return webResponse
}
存储库中
我有以下功能-注意
挂起
分派器.IO

    suspend fun insertAndSend(task: Task) {
        withContext(Dispatchers.IO) {
            val response = callWebService(processedTask)
            processedTask.status = response
            taskDao.update(processedTask)
        }
    }
ViewModel
中,我调用
ViewModelScope

//defined in ViewModel class
 fun insertAndSend(task: Task) = viewModelScope.launch { repository.insertAndSend(task) }

在相应的
片段
中,通过按下按钮

可以触发它,多亏了这个
它可以归结为使用
Dispatchers.IO在后台运行
SOAP调用可以是常规函数,不需要进行微分等

我使用的是带有存储库的MVVM模型,因此所有的后台工作都在
存储库
级别上进行,由在相应的
视图模型
中启动的
片段
中的按钮触发,范围有限

我的SOAP调用现在看起来像这样

fun callWebService(...): String {
        try {
...
            val envelope = SoapSerializationEnvelope(SoapEnvelope.VER12)
...
            val androidHttpTransport = HttpTransportSE(URL)
            androidHttpTransport.debug = true
            androidHttpTransport.call("$NAMESPACE/$methodName", envelope)    
            val resultData = envelope.response
            webResponse = "$resultData"
...
        }
        return webResponse
}
存储库中
我有以下功能-注意
挂起
分派器.IO

    suspend fun insertAndSend(task: Task) {
        withContext(Dispatchers.IO) {
            val response = callWebService(processedTask)
            processedTask.status = response
            taskDao.update(processedTask)
        }
    }
ViewModel
中,我调用
ViewModelScope

//defined in ViewModel class
 fun insertAndSend(task: Task) = viewModelScope.launch { repository.insertAndSend(task) }
通过按下按钮在相应的
片段中触发