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()强行打断。

猜你喜欢

转载自blog.csdn.net/mp624183768/article/details/125128304