withContext 与 suspend 区别是什么?

2020-07-20 20:52:44 +08:00
 andev
withContext 是指定协程运行的线程,suspend 是挂起,那请求网络时见到这两种写法,一种用 withContext(Dispatchers.IO)请求,另一种在 viewscope 里调用 suspend 请求网络的方法,这两种方法有什么区别?
第二种方法里的 suspend 方法还是在主线程里执行吗?
5100 次点击
所在节点    Android
6 条回复
domosekai
2020-07-20 21:07:02 +08:00
viewscope 里调用的 suspend 函数在不在主线程执行,要看这个函数本身的实现选择了什么 context (它自己会调用 withcontext ),一般而言网络相关的 API 如果封装成了 suspend 那么就不会在主线程执行,但这个是它自己选择的 context 而不是你怎么调用它所决定的。你也完全可以写一个在主线程跑的 suspend 函数。
domosekai
2020-07-20 21:25:41 +08:00
至于你说的前一种,一般是要调用的函数不是 suspend 而是 blocking 的,那么就得由你给一个非主线程的 context,因为他自己不选择
mxalbert1996
2020-07-20 22:33:45 +08:00
withContext 是在一个 CoroutineScope 里切换 Context 用的。suspend fun 只是表示这个方法会挂起 Coroutine 所以必须在 CoroutineScope 里或者由其他 suspend fun 调用,它本身不指定 Context 。用途完全不一样。
话说这种基本的东西还是建议去看官方文档,研究一下教程里的案例就很容易理解了。
maninfog
2020-07-20 22:43:51 +08:00
suspend 关键字标记函数表示该函数只能在协程 scope 中或者另一个 suspend 方法中调用,一般该函数为耗时函数。
withContext 则表示将接受的代码块内的东西放到指定 Dispatcher 中调用,调用完毕后自动切回当前 scope 继续运行。
fansangg
2020-07-21 00:42:19 +08:00
withContext 切线程,suspend 标识一个协程函数
cjh1095358798
2020-07-21 11:24:35 +08:00
suspend 只是一个标记

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/691713

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX