【发布时间】:2019-10-10 01:50:42
【问题描述】:
您好,我在一个项目中使用 Kotlin 协程库。
下面的方法调用一个挂起函数,它返回一个布尔值。
fun isNetworkAvailable(context: Context?): Boolean {
//return checkNetworkReachability(context)
var isNetworkAvailable = false
GlobalScope.launch(Dispatchers.Default) {
isNetworkAvailable = GlobalScope.async<Boolean> {
checkNetwork()
}.await()
}
return isNetworkAvailable
}
这里的 checkNetwork 是挂起函数。在执行它之前,返回值被传递给调用者(视图/活动)。 如果不将“isNetworkAvailable”设为挂起,我该如何实现?
在 checkNetwork 方法中,检查调用网络调用的可达性,如下所示。
private suspend fun checkNetwork() : Boolean {
val value = GlobalScope.async<Boolean> {
val isEastReachable = async { checkEastReachable() }
if (!isEastReachable.await()) {
checkWestReachable()
} else {
true
}
}
return value.await()
}
而子方法是
private suspend fun checkEastReachable(): Boolean = coroutineScope {
withContext(Dispatchers.Default) {
repository.networkManager.callReachableEast()
}
}
private suspend fun checkWestReachable(): Boolean = coroutineScope {
withContext(Dispatchers.Default) {
repository.networkManager.callReachableWest()
}
}
子挂起方法正在使用改造调用 Web 服务。因为它会返回一个布尔值,所以我将它作为一个同步的 .execute() 调用。
fun callReachableEast(): Boolean {
return try {
val requestCall =
ApiService.create("eastApi").getReachabilityEast()
requestCall.execute().isSuccessful
} catch (exception: Exception) {
false
}
}
fun callReachableWest(): Boolean {
return try {
val requestCall =
ApiService.create("westApi").getReachabilityWest()
return requestCall.execute().isSuccessful
} catch (exception: Exception) {
false
}
}
我已经浏览了以下链接
https://kotlinlang.org/docs/reference/coroutines/composing-suspending-functions.html
https://proandroiddev.com/async-operations-with-kotlin-coroutines-part-1-c51cc581ad33
还有更多。
重复我的问题,如果不将“isNetworkAvailable”设置为挂起,我该如何实现?
【问题讨论】:
-
什么意思~"在执行之前将返回值传递给调用者"
标签: android kotlin async-await kotlin-coroutines coroutinescope