Kotlin 协程基本的使用/挂起与阻塞

Posted 安果移不动

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin 协程基本的使用/挂起与阻塞相关的知识,希望对你有一定的参考价值。

接上次的网络请求

Android Jetpack Kotlin/Java pageing3的基础使用。_安果移不动的博客-CSDN博客

点击按钮请求数据并返回到textView当中

接口如下

import com.anguomob.jecpack.bean.FeedBackLists
import com.anguomob.jecpack.bean.Response
import retrofit2.http.GET
import retrofit2.http.Query

interface Api 
    @GET("api/v1/open/app/feedback/test")
    suspend fun getFeedBack(
        @Query("page") page: Int,
        @Query("size") size: Int
    ): Response<FeedBackLists>

代码如下

package com.anguomob.jecpack.activity

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.anguomob.jecpack.R
import com.anguomob.jecpack.api.RetrofitClient
import com.anguomob.jecpack.bean.FeedBackLists
import com.anguomob.jecpack.bean.Response
import com.anguomob.jecpack.databinding.ActivityCorutineBinding
import com.anguomob.jecpack.databinding.ActivityPagingBinding
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext

class CoroutineActivity : AppCompatActivity() 
    private lateinit var binding: ActivityCorutineBinding
    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        binding = ActivityCorutineBinding.inflate(layoutInflater)
        setContentView(binding.root)
        binding.btClick.setOnClickListener 
            //协程 在主线程中操作
            GlobalScope.launch(Dispatchers.Main) 
                //切到子线程进行操作
                val repoResponse: Response<FeedBackLists>
                withContext(Dispatchers.IO) 
                    repoResponse = RetrofitClient
                        .instance
                        .getApi()
                        //suspend 挂起的方法必须在携程体内进行调用
                        .getFeedBack(1, 1)
                
                //还是在主线程
                binding.tvText.text = "repoResponse :$repoResponse.data!!.data[0].content"
            
        
    

实际上的Retrofit已经不需要切换线程去加载ui了。

这里的操作只是为了讲述如何切换线程而已。

suspend  是挂起的意思。就是将代码挂起上去。

        binding.btClick2.setOnClickListener 
            //协程 在主线程中操作
            time = System.currentTimeMillis()
            GlobalScope.launch(Dispatchers.Main) 

                //挂起
                delay(3000)
                val intervalTime = System.currentTimeMillis() - time
                Log.e(
                    TAG,
                    "onCreate: $Thread.currentThread().name:after delay $intervalTime"
                )
                //阻塞
//                Thread.sleep(3000)
//                val intervalTime = System.currentTimeMillis() - time
//                Log.e(
//                    TAG,
//                    "onCreate: $Thread.currentThread().name:after sleep $intervalTime"
//                )
            
        

快速的3点击后

而且中间相差时间不会很多。看前面的打印时间

 

 

阻塞就不一样了。阻塞的话 需要每次等待

 

几乎差3s

 

 需要当前线程执行结束后才可以继续执行。就是sleep是Thread的静态类方法sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。

一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。

以上是关于Kotlin 协程基本的使用/挂起与阻塞的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 协程协程的挂起和恢复 ② ( 协程挂起 和 线程阻塞 对比 )

Kotlin -- 知识点协程

android kotlin 协程 理解挂起,恢复以及job

Kotlin协程基础介绍--协程(Coroutines)是一种轻量级的线程

Kotlin 多平台:如何在没有 runBlocking 的情况下以阻塞方式启动协程

Kotlin 协程是个什么东西?