何时以及如何从Android活动中调用暂停函数? [英] When and how to call suspend function from Android Activity?

查看:0
本文介绍了何时以及如何从Android活动中调用暂停函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个suspend函数,它向服务器调用POST请求。我想在活动中配置一些文本以显示我从服务器收到的信息。

suspend fun retrieveInfo():String 

我尝试在onCreateonResume内部调用,但运行时崩溃。

runBlocking { 
    retrieveInfo()
}
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.google.augmentedimage/com.google.AugmentedImageActivity}: android.os.NetworkOnMainThreadException
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3086)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3229)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)

我应该将这些挂起调用放在哪里(放在活动生命周期的哪一部分中)?我是否应该使用runBlocking以外的其他内容?

推荐答案

默认runBlocking在被调用的线程runBlocking中运行挂起代码block

因此,如果您从Activity回调调用runBlocking,您的挂起块将在无法访问网络(查询服务器)的主线程上执行。

您需要在协程块中为该调用切换调度程序。对代码最简单的修复方法是将执行移到Dispatchers.IO

runBlocking {
    withContext(Dispatchers.IO) {
        retrieveInfo()
    }
}

话虽如此,我建议两件事(与您的问题没有直接关系):

  1. 阅读Coroutines on Android(本部分及以下部分)

2.不要使用runBlocking,而要定义正确的job并使用job.launch{}

这篇关于何时以及如何从Android活动中调用暂停函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆