import kotlinx.coroutines.*
import java.lang.NullPointerException
class MainActivity : AppCompatActivity() {
private lateinit var btn:Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btn = findViewById(R.id.btn)
btn.setOnClickListener {
start()
}
}
private fun start(){
runBlocking {
Log.d(“runBlocking”, “启动一个协程”)
}
GlobalScope.launch{
Log.d(“launch”, “启动一个协程”)
}
GlobalScope.async{
Log.d(“async”, “启动一个协程”)
}
}
}
然后运行app,点击按钮执行start()
方法。我们就可以在控制台上看到如下输出:
D/runBlocking: 启动一个协程
D/launch: 启动一个协程
D/async: 启动一个协程
哇
,so easy。协程原来这么简单,那我们接着继续往下走。上面提到过三种启动方式分别会的得到各自的返回信息。我们现在增加三个变量然后分别用协程进行赋值,同时进行输出:
private fun start(){
val runBlockingJob = runBlocking {
Log.d(“runBlocking”, “启动一个协程”)
}
Log.d(“runBlockingJob”, “$runBlockingJob”)
val launchJob = GlobalScope.launch{
Log.d(“launch”, “启动一个协程”)
}
Log.d(“launchJob”, “$launchJob”)
val asyncJob = GlobalScope.async{
Log.d(“async”, “启动一个协程”)
“我是返回值”
}
Log.d(“asyncJob”, “$asyncJob”)
}
然后运行,我们可以在控制台上看到如下输出:
D/runBlocking: 启动一个协程
D/runBlockingJob: 41
D/launchJob: StandaloneCoroutine{Active}@3b8b871
D/launch: 启动一个协程
D/async: 启动一个协程
D/asyncJob: DeferredCoroutine{Active}@63f265
也有可能是
D/runBlocking: 启动一个协程
D/runBlockingJob: 41
D/launchJob: StandaloneCoroutine{Active}@1344515
D/asyncJob: DeferredCoroutine{Active}@38c002a
D/async: 启动一个协程
D/launch: 启动一个协程
还有可能是
D/runBlocking: 启动一个协程
D/runBlockingJob: 41
D/launch: 启动一个协程
D/launchJob: StandaloneCoroutine{Active}@b94e973
D/async: 启动一个协程
D/ asyncJob: DeferredCoroutine{Active}@f7aa030
嗯哼,什么情况
怎么后面4条日志顺序还是随机的。没有看懂的童鞋,说明你没有仔细看上面的文字。
知识点来了,赶紧拿出你的小本本记下来,我们一个一个的来分析。
我们在上面提到过runBlocking
启动的是一个新的协程并阻塞调用它的线程,我们对比输出日志可以看到前两条runBlocking
的相关输出日志的位置顺序是不会变化的,这就证明我们之前所说的runBlocking
会阻塞调用它的线程,直到runBloc