我试图理解为什么我们需要 callbackFlow builder,它似乎与 channelFlow 几乎相同,除了 callbackFlow 是内联的。用例是什么?
能否请您解释一下这两段代码之间的区别.第一次打印421,但第二次打印606.为什么第一个是平行的而第二个是顺序的?
fun main(args: Array<String>) = runBlocking {
var time = measureTimeMillis {
val one = async { one() }
val two = async { two() }
val int1 = one.await()
val int2 = two.await()
println(int1 + int2)
}
println(time)
time = measureTimeMillis {
val one = async { one() }.await()
val two = async { two() }.await()
println(one + two)
}
print(time)
}
suspend fun one(): Int {
delay(200)
return 12
}
suspend fun two(): Int {
delay(400)
return 23 …Run Code Online (Sandbox Code Playgroud) 关于这个话题我有两个问题。我将在 android 中使用这些用例类,并尝试实现类似于此的架构https://www.youtube.com/watch?v=Sy6ZdgqrQp0 但我需要一些答案。
1)我有一个延迟的异步构建器,当我取消作业时,其他链也被取消。此代码打印“呼叫已取消”。但我不确定我做得是否正确。
fun main(args: Array<String>) = runBlocking<Unit> {
val job = GlobalScope.launch {
println(getUser())
}
job.cancelAndJoin()
}
suspend fun getUser() = getUserDeferred().await()
suspend fun getUserDeferred() = coroutineScope {
val request = Request.Builder()
.url("https://jsonplaceholder.typicode.com/users")
.build()
val call = OkHttpClient().newCall(request)
val deferred = async(Dispatchers.IO) {
val body = call.execute()
body.body()?.string() ?: ""
}
deferred.invokeOnCompletion {
if (deferred.isCancelled) {
println("Call cancelled")
call.cancel()
}
}
deferred
}
Run Code Online (Sandbox Code Playgroud)
2)我找不到取消这个的方法。我想在retrofit2调用适配器中使用它,有没有更好的方法来处理这种情况。
fun main(args: Array<String>) = runBlocking<Unit> {
val job = GlobalScope.launch {
println(getUser1()) …Run Code Online (Sandbox Code Playgroud) 目前,我正在研究Android应用架构,我无法理解Github Repo Sample中的一件事。我们可以决定使用速率限制器或null检查来获取新数据,但是在这种情况下,我们只是将新值插入数据库中,而不会从数据库中删除旧值。例如,如果数据库中的旧结果之一从服务器中删除(用户删除的存储库)?它将仍在数据库中吗?我们如何消除这些价值?我是否缺少某些东西,或者这是未处理的案件?