andev
V2EX  ›  Android

withContext 与 suspend 区别是什么?

  •  
  •   andev · Jul 20, 2020 · 13595 views
    This topic created in 2130 days ago, the information mentioned may be changed or developed.
    withContext 是指定协程运行的线程,suspend 是挂起,那请求网络时见到这两种写法,一种用 withContext(Dispatchers.IO)请求,另一种在 viewscope 里调用 suspend 请求网络的方法,这两种方法有什么区别?
    第二种方法里的 suspend 方法还是在主线程里执行吗?
    6 replies    2020-07-21 11:24:35 +08:00
    domosekai
        1
    domosekai  
       Jul 20, 2020
    viewscope 里调用的 suspend 函数在不在主线程执行,要看这个函数本身的实现选择了什么 context (它自己会调用 withcontext ),一般而言网络相关的 API 如果封装成了 suspend 那么就不会在主线程执行,但这个是它自己选择的 context 而不是你怎么调用它所决定的。你也完全可以写一个在主线程跑的 suspend 函数。
    domosekai
        2
    domosekai  
       Jul 20, 2020
    至于你说的前一种,一般是要调用的函数不是 suspend 而是 blocking 的,那么就得由你给一个非主线程的 context,因为他自己不选择
    mxalbert1996
        3
    mxalbert1996  
       Jul 20, 2020 via Android
    withContext 是在一个 CoroutineScope 里切换 Context 用的。suspend fun 只是表示这个方法会挂起 Coroutine 所以必须在 CoroutineScope 里或者由其他 suspend fun 调用,它本身不指定 Context 。用途完全不一样。
    话说这种基本的东西还是建议去看官方文档,研究一下教程里的案例就很容易理解了。
    maninfog
        4
    maninfog  
       Jul 20, 2020 via iPhone
    suspend 关键字标记函数表示该函数只能在协程 scope 中或者另一个 suspend 方法中调用,一般该函数为耗时函数。
    withContext 则表示将接受的代码块内的东西放到指定 Dispatcher 中调用,调用完毕后自动切回当前 scope 继续运行。
    fansangg
        5
    fansangg  
       Jul 21, 2020
    withContext 切线程,suspend 标识一个协程函数
    cjh1095358798
        6
    cjh1095358798  
       Jul 21, 2020
    suspend 只是一个标记
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5201 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 01:17 · PVG 09:17 · LAX 18:17 · JFK 21:17
    ♥ Do have faith in what you're doing.