Android и Kotlin noob здесь - у меня есть приложение, вызывающее веб-службу SOAP. Прямо сейчас звонки осуществляются с помощью Thread и связь работает. Я хотел бы перенести это в Kotlin сопрограмм или Android Asyn c задач, мой вопрос - что лучше в этом случае?
Я пытался создать вызов сопрограммы на основе этого article https://proandroiddev.com/how-to-make-sense-of-kotlin-coroutines-b666c7151b93, в основном адаптируя этот шаблон:
fun main() = runBlocking {
val deferredResult = async {
delay(1000L)
"World!"
}
println("Hello, ${deferredResult.await()}")
}
Когда я помещаю вызов веб-службы в сопрограмму asyn c, тогда Android Studio выделяет метод вызова HttpTransportSE (http://www.kobjects.org/ksoap2/doc/api/org/ksoap2/transport/HttpTransportSE.html) со следующим предупреждением:
Неправильный вызов метода блокировки. Сообщает о вызовах методов блокировки потоков, найденных во фрагменте кода, где поток не должен блокироваться "
Мое понимание этого сообщения состоит в том, что вызов, сделанный HttpTransportSE, блокирует поток, поэтому мы теряем преимущество использования сопрограмм, и я должен просто придерживаться задачи Asyn c. Это правильная интерпретация, или есть способ обернуть вызов с сопрограммой, который будет работать более правильно?
Ниже мой код ( он связывается с веб-службами, но из-за предупреждения у меня возникает ощущение, что это неправильный способ сделать это):
fun callWebService(
...
): String {
val defferedResult: Deferred<String> = GlobalScope.async {
try {
...
val envelope = SoapSerializationEnvelope(SoapEnvelope.VER12)
...
val androidHttpTransport = HttpTransportSE(URL)
androidHttpTransport.debug = true
androidHttpTransport.call("$NAMESPACE/$methodName", envelope) //this is where I get the warning
val resultData = envelope.response
webResponse = "$resultData"
...
}
return@async webResponse
}
return runBlocking { defferedResult.await() }
}