看完 扔物线 讲的关于Kotlin的协程,自己做一下自我总结。
Kotlin的协程是什么?
它是在java线程基础上封装一种线程调用的框架,它本质上还是跑在线程上的。
它是为了方便我们不用写过多的代码去关注或实现线程的切换的事情。
举个例子,在Android上,子线程不能更新UI,而网络请求又不能在主线程进行。
假定有一个场景,点击按钮后,从服务端把文字请求下来,并展现在TextView上,
一般我们用java的时候是这么写的:
{
// ... ...
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i(TAG,"click...");
new Thread(new Runnable() {
@Override
public void run() {
final String text = getFromServer();
Log.i(TAG,"get end...");
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(text);
}
});
}
}).start();
}
});
}
private String getFromServer(){
//todo 网络请求
return text;
}
当然,你也可以稍微有点高级的写法,比如,使用线程池,使用Future,Handler等等写法,本质上都需要创建一个线程,并在线程获得结果后再切到主线程更新TextView。
但是,如果使用Kotlin,就可以这么写:
btn.setOnClickListener {
GlobalScope.launch(Dispatchers.Main) {
var fromServer = getFromServer()
Log.i(TAG,"get end...") //后打印
textView.text = fromServer
}
Log.i(TAG,"click...") //先打印
}
suspend fun getFromServer(): String? {
return withContext(Dispatchers.IO){
//todo 网络请求
return@withContext ""
}
}
所以,这样写的话就感觉非常爽,代码量少,而且不用关心线程切换。只需要在需要的地方加上 Dispatchers.Main 和 Dispatchers.IO 声明,Kotlin的协程就能帮我们主动做线程切换了。
参看:
https://kaixue.io/kotlin-coroutines-1/