首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么Coroutine在返回结果时表现得很奇怪?

为什么Coroutine在返回结果时表现得很奇怪?
EN

Stack Overflow用户
提问于 2020-05-20 06:55:34
回答 2查看 57关注 0票数 0

我有两种方法,比如A和B,它们都是从Coroutine范围返回结果的,它们都是以相同的方式实现的,但是一种很好,另一种是例外。他们为什么表现得很奇怪?这是我的A方法的代码

代码语言:javascript
运行
复制
fun addCartToFirebase(itemId: String,cart: Basket) : Pair<String,Int>?{
    var pair:Pair<String,Int>? = null
    CoroutineScope(IO).launch {
        databaseReference.child("Cart").child("Anonymous").child(itemId).setValue(cart).addOnSuccessListener {
                pair = Pair("result",1)
            }
            .addOnFailureListener {
                    pair = Pair("result",0)
             }
    }
    return pair
}

方法A工作正常,但是方法B不是working.Here是B的代码

代码语言:javascript
运行
复制
fun submitFinalCart(cartData : HashMap<String,List<String>>) : Pair<String,Int>{
    var pair:Pair<String,Int>? = null
    CoroutineScope(IO).launch {
            databaseReference.child("FinalCart").push().setValue(cartData).addOnSuccessListener {
               pair = Pair("result",1)
              }.addOnFailureListener {
                pair = Pair("result",0)
            }
       }
    return pair!!
}

为什么会这样。我该怎么修呢?

编辑过的

我的ViewModel类代码

代码语言:javascript
运行
复制
fun setCart(itemId : String, cart: Basket) : Pair<String,Int>?{
    return firebaseNetwork.addCartToFirebase(itemId,cart)
}

我的片段类代码

代码语言:javascript
运行
复制
binding.addToCart.setOnClickListener {
        val cart = Basket()
        cart.itemsId = itemId
        cart.itemWeight =binding.counter.text.toString()
        val pair = selectedItemViewModel.setCart(binding.category?.id!!,cart)
        Log.d("pair value",pair?.second?.toString()!!)
        if(pair.second == 0){
            showShortToast("Failed")
        }
        else{
            showShortToast("Success")
            binding.cartIndicator.visibility =View.VISIBLE
        }
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-20 07:23:26

这是因为addCartToFirebase方法返回nullsubmitFinalCart也希望这样做,但是!!不允许这样做。您必须等待您的协同线完成或返回Deferred<Pair<String,Int>>

例如,您可以使用suspendCoroutine从回调获得如下结果:

代码语言:javascript
运行
复制
suspend fun submitFinalCart(cartData: HashMap<String, List<String>>): Pair<String, Int> =
    withContext(IO) {
        suspendCoroutine { continuation ->
            databaseReference.child("FinalCart").push().setValue(cartData).addOnSuccessListener {
                continuation.resume(Pair("result", 1))
            }.addOnFailureListener {
                continuation.resume(Pair("result", 0))
            }
        }
    }
票数 1
EN

Stack Overflow用户

发布于 2020-05-20 09:48:57

你在努力做不可能的事。您希望从挂起的调用返回而不挂起您的函数。

只是让功能暂停。

代码语言:javascript
运行
复制
suspend fun addCartToFirebase(itemId: String, cart: Basket): Boolean =
    suspendCoroutine { cont ->
        databaseReference.child("Cart").child("Anonymous").child(itemId).setValue(cart).addOnSuccessListener {
            cont.resume(true)
        }
        .addOnFailureListener {
            cont.resume(false)
        }
    }

suspend fun setCart(itemId: String, cart: Basket): Boolean =
    firebaseNetwork.addCartToFirebase(itemId,cart)

// Set your listener
binding.addToCart.setOnClickListener {
    val cart = Basket()
    cart.itemsId = itemId
    cart.itemWeight =binding.counter.text.toString()

    viewModelOwner.viewModelScope.launch {
        val result = selectedItemViewModel.setCart(binding.category?.id!!, cart)
        Log.d("result", result)

        if(result) {
            showShortToast("Success")
            binding.cartIndicator.visibility = View.VISIBLE
            // Start the activity here
        } else showShortToast("Failed")
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61906866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档