接上次的网络请求
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()强行打断。