kotlin协程withContext的使用

简介: kotlin协程withContext的使用

众所周知,async和launch是启动协程的两种方式。由于我们知道async是用来取回结果的,所以只有当我们需要并行执行时才应该使用&,而launch则是当我们不想取回结果时使用,用于更新等操作我们知道,到目前为止,异步是启动协程并返回结果的唯一方法,但是当我们不想进行并行网络调用时,异步就会出现问题。众所周知,使用async时,需要使用 await ()函数,这会导致主线程阻塞,但是这里引入了withContext的概念,解决了主线程阻塞的问题。

withContext 只是编写异步的另一种方式,无需编写await()。使用 withContext 时,它会串行而不是并行运行任务。因此,应该记住,当我们在后台有一个任务并且想要返回该任务的结果时,我们应该使用 withContext。让我们举一个例子来演示 withContext 的工作原理:

    // two kotlin suspend functions
    // Suppose we have two tasks like below
    private suspend fun doTaskOne(): String
    {
    delay(2000)
    return "码农乐园"
    }
    private suspend fun doTaskTwo(): String
    {
    delay(2000)
    return "kotlin withContext"
    }

    让我们使用 async-await 并行运行这两个任务,然后使用 withcontext 来看看两者之间的区别。

      // kotlin function using async
      fun startLongRunningTaskInParallel()
      {
      viewModelScope.launch
      {
        val resultOneDeferred = async { TaskOne() }
        val resultTwoDeferred = async { TaskTwo() }
        val combinedResult = resultOneDeferred.await() 
        + resultTwoDeferred.await()
      }
      }
      

      这里使用异步,两个任务并行运行。现在让我们使用 withContext 并使用withContext连续执行相同的任务

        // kotlin function using withContext
        fun startLongRunningTaskInParallel()
        {
        viewModelScope.launch
        {
          val resultOne = withContext(Dispatchers.IO) { TaskOne() }
          val resultTwo = withContext(Dispatchers.IO) { TaskTwo() }
          val combinedResult = resultOne + resultTwo
        }
        }
        

        这里可以看到,在withContext中一切都是一样的,唯一的区别是这里我们不必使用await ()函数,并且任务是以串行方式执行的。由于这里已经执行了多个任务,因此应该记住 async 应该与多个任务一起使用,而 withContext 应该与单个任务一起使用现在我们举个例子,尝试详细了解 withContext 以及它是如何执行的;

          // sample kotlin program for complete
          // demonstration of withContext
          fun testWithContext
          {
          var resultOne = "码农乐园"
          var resultTwo = "testWithContext"
          Log.i("withContext", "Before")
          resultOne = withContext(Dispatchers.IO) { function1() }
          resultTwo = withContext(Dispatchers.IO) { function2() }
          Log.i("withContext", "After")
          val resultText = resultOne + resultTwo
          Log.i("withContext", resultText)
          }
          suspend fun function1(): String
          {
          delay(1000L)
          val message = "function1"
          Log.i("withContext", message)
          return message
          }
          suspend fun function2(): String
          {
          delay(100L)
          val message = "function2"
          Log.i("withContext", message)
          return message
          }
          
          相关文章
          |
          5天前
          |
          开发者 Kotlin Android开发
          Kotlin协程在Android开发中的应用
          【7月更文挑战第10天】Kotlin协程简化了Android异步编程,提供轻量级并发。挂起函数让异步代码看起来同步,不阻塞线程,便于管理。在项目中,添加Kotlin和协程依赖,如`kotlinx.coroutines-core`和`kotlinx-coroutines-android`。使用`CoroutineScope`和`launch`处理耗时任务,如网络请求,避免主线程阻塞。挂起函数和调度器控制执行上下文,适应不同任务需求。
          |
          7天前
          |
          存储 Java 编译器
          kotlin协程的理解
          kotlin协程的理解
          12 0
          |
          设计模式 Java 编译器
          Kotlin协程(Coroutine)
          Kotlin协程(Coroutine)
          88 0
          |
          安全 Java 编译器
          Kotlin | 深入理解协程
          协程由程序自己创建和调度,不需要操作系统调度,所以协程比线程更加轻量。相比于线程的切换,协程切换开销更小,速度更快
          225 0
          |
          应用服务中间件 Apache nginx
          kotlin的协程在网络请求方面的应用
          GET代表希望从服务器那里获取数据,POST则代表向服务器提交数据
          411 0
          |
          Java 编译器 Android开发
          Kotlin | 协程是什么?
          Hi你好,新同学。很高兴,你终于追寻这个问题了,也许你正感到迷茫,各路大神对协程的理解不一,有人说它是线程框架,有人说它比线程更轻,希望我这篇文可以帮你从另一个角度简单理解协程。
          117 0
          |
          Java 编译器 API
          Kotlin |协程的理解和使用
          Kotlin |协程的理解和使用
          |
          Android开发 Kotlin
          Kotlin | 关于协程异常处理,你想知道的都在这里(上)
          关于协程的异常处理,一直以来都不是一个简单问题。因为涉及到了很多方面,包括 异常的传递 ,结构化并发下的异常处理 ,异常的传播方式 ,不同的Job 等,所以常常让很多(特别是刚使用协程的,也不乏老手)同学摸不着头脑。
          237 0
          Kotlin | 关于协程异常处理,你想知道的都在这里(上)
          |
          Kotlin
          Kotlin | 关于协程异常处理,你想知道的都在这里(下)
          关于协程的异常处理,一直以来都不是一个简单问题。因为涉及到了很多方面,包括 异常的传递 ,结构化并发下的异常处理 ,异常的传播方式 ,不同的Job 等,所以常常让很多(特别是刚使用协程的,也不乏老手)同学摸不着头脑。
          334 0
          Kotlin | 关于协程异常处理,你想知道的都在这里(下)
          |
          安全 Java 调度
          kotlin协程也有并发?
          kotlin协程也有并发?
          624 0
          kotlin协程也有并发?