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 协程协程的挂起和恢复 ② ( 协程挂起 和 线程阻塞 对比 )
android kotlin 协程 理解挂起,恢复以及job
Kotlin协程基础介绍--协程(Coroutines)是一种轻量级的线程