V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
andev
V2EX  ›  Android

withContext 与 suspend 区别是什么?

  •  
  •   andev · 2020-07-20 20:52:44 +08:00 · 1914 次点击
    这是一个创建于 461 天前的主题,其中的信息可能已经有所发展或是发生改变。
    withContext 是指定协程运行的线程,suspend 是挂起,那请求网络时见到这两种写法,一种用 withContext(Dispatchers.IO)请求,另一种在 viewscope 里调用 suspend 请求网络的方法,这两种方法有什么区别?
    第二种方法里的 suspend 方法还是在主线程里执行吗?
    6 条回复    2020-07-21 11:24:35 +08:00
    domosekai
        1
    domosekai   2020-07-20 21:07:02 +08:00
    viewscope 里调用的 suspend 函数在不在主线程执行,要看这个函数本身的实现选择了什么 context (它自己会调用 withcontext ),一般而言网络相关的 API 如果封装成了 suspend 那么就不会在主线程执行,但这个是它自己选择的 context 而不是你怎么调用它所决定的。你也完全可以写一个在主线程跑的 suspend 函数。
    domosekai
        2
    domosekai   2020-07-20 21:25:41 +08:00
    至于你说的前一种,一般是要调用的函数不是 suspend 而是 blocking 的,那么就得由你给一个非主线程的 context,因为他自己不选择
    mxalbert1996
        3
    mxalbert1996   2020-07-20 22:33:45 +08:00 via Android
    withContext 是在一个 CoroutineScope 里切换 Context 用的。suspend fun 只是表示这个方法会挂起 Coroutine 所以必须在 CoroutineScope 里或者由其他 suspend fun 调用,它本身不指定 Context 。用途完全不一样。
    话说这种基本的东西还是建议去看官方文档,研究一下教程里的案例就很容易理解了。
    maninfog
        4
    maninfog   2020-07-20 22:43:51 +08:00 via iPhone
    suspend 关键字标记函数表示该函数只能在协程 scope 中或者另一个 suspend 方法中调用,一般该函数为耗时函数。
    withContext 则表示将接受的代码块内的东西放到指定 Dispatcher 中调用,调用完毕后自动切回当前 scope 继续运行。
    fansangg
        5
    fansangg   2020-07-21 00:42:19 +08:00
    withContext 切线程,suspend 标识一个协程函数
    cjh1095358798
        6
    cjh1095358798   2020-07-21 11:24:35 +08:00
    suspend 只是一个标记
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2360 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 13:18 · PVG 21:18 · LAX 06:18 · JFK 09:18
    ♥ Do have faith in what you're doing.