所以我必须打个网络电话,为此我要使用这样的协程:
lifecycleScope.launch {
sendData()
}
private suspend fun sendData() = withContext(Dispatchers.IO) {
try {
withTimeout(5000L) {
// Sends a network request and handles response using a network function without suspend
}
} catch(e: TimeoutCancellationException) {
...
}
}
我的问题是,这与创建Runnable相比有弊吗?由于没有在sendData()中调用的暂停函数,因此从此函数调用的网络函数是常规的阻止调用。在这里使用协程是不好的做法吗?
答案 0 :(得分:1)
不,这不是一个坏习惯。
我可以看到您正在创建suspend function
,因为您想更改线程并为网络调用指定超时。
在suspend function
内部调用another suspend function
并不是必须的。
但是,suspend function
只能在Coroutine Builder
或another suspend function
内部调用。
感谢Marko Topolnik的详细信息:)
答案 1 :(得分:0)
如果您正在使用的HTTP请求依赖项包含一个回调,则该库本身将负责线程处理。改装可以做到这一点。
因此,HTTP请求将无阻塞,但回调将在主线程中,从而不必进行挂起。
类似地,如果有回调,那么也不需要可运行对象。
请注意,协程和线程并不相同,往往是相关的,但并非所有协程都是后台线程。
缺点是您在回调中的HTTP请求之后要做。通常,HTTP请求之后是在DB上进行写操作,因此这就是为什么提供回调的依赖项仍然封装在抽象中并使用提供的阻塞方法的原因。