Kotlinにおける協程通俗理解
3303 ワード
What?
ウィキペディア
コラボレーションはコンピュータプログラムのコンポーネントであり、コラボレーション型マルチタスクのサブプログラムを普及させ、実行が保留され、リカバリされることを可能にする.
自分の理解(定義を書くには深く理解する必要があります.深く理解していないので、ぼんやり見てください)
コンシステントは,割り込みメカニズムによって代替コールバックメカニズムを実現するサブルーチンである.
Why?
RxJavaと比較したメリットコパスを使用することで、コードをより簡潔にすることができ、コールバック方法 を極めて避けることができる.リソースを消費するスレッド切替(コアメリット) を回避
欠点 Java などの少ない言語サポート各種制御フローのサポートはまだ完全にカバーされていないはずで、RxJavaはほとんど を完了しています.がなくなったようです...
When?
時間のかかる操作を行う必要がある場合に用い,RxJavaを知っていれば,ほとんどの簡単なRxJavaで書かれたコードに代わることができるといえる.しかし、Javaで書いたRxなら、洗濯して寝ましょう.
How?
ここでは,コパスを用いた3つの制御フローの書き方をコード形式で紹介し,具体的な詳細はコードに示す.第1の制御フロー:サブスレッドで時間のかかる動作を実行し、UIスレッドでView を更新する.の第2の制御フロー:2つの時間のかかるタスクtask 1、task 2は依存しており、task 2はtask 1の実行が完了するまで待たなければならない. 第3の制御フロー:同時に2つのスレッドを開いて時間のかかるタスクを実行し、両方が実行完了すると、UIスレッドは戻ってきたデータ をロードする.
ウィキペディア
コラボレーションはコンピュータプログラムのコンポーネントであり、コラボレーション型マルチタスクのサブプログラムを普及させ、実行が保留され、リカバリされることを可能にする.
自分の理解(定義を書くには深く理解する必要があります.深く理解していないので、ぼんやり見てください)
コンシステントは,割り込みメカニズムによって代替コールバックメカニズムを実現するサブルーチンである.
Why?
RxJavaと比較したメリット
欠点
When?
時間のかかる操作を行う必要がある場合に用い,RxJavaを知っていれば,ほとんどの簡単なRxJavaで書かれたコードに代わることができるといえる.しかし、Javaで書いたRxなら、洗濯して寝ましょう.
How?
ここでは,コパスを用いた3つの制御フローの書き方をコード形式で紹介し,具体的な詳細はコードに示す.
package com.yueyue_projects.demo.coroutines
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import com.yueyue_projects.demo.R
import com.yueyue_projects.demo.utils.MyLog
import kotlinx.android.synthetic.main.activity_coroutines.*
import kotlinx.coroutines.*
class CoroutinesActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_coroutines)
//
requestDataAndUpdateUI()
//
requestTwoDependencyDataAndReturn()
//
requestDirectTwoDataAndUpdateUI()
// ,
tv_1.text = "data is loading please wait"
tv_2.text = "data is loading please wait"
tv_3.text = "data is loading please wait"
}
// launch ,Dispatchers.Main , IO
// UI
private fun requestDataAndUpdateUI() = GlobalScope.launch(Dispatchers.Main) {
tv_1.visibility = View.VISIBLE
// ,async IO
val deferred = async {
delay(2000)
"data loading has finished"
}
// deferred.await() , ,
tv_1.text = deferred.await()
}
private fun requestTwoDependencyDataAndReturn() = GlobalScope.launch(Dispatchers.Main) {
//
tv_2.visibility = View.VISIBLE
// withContext async{}.await()
// await Main , ,
tv_2.text = withContext(Dispatchers.Default) {
delay(2000)
"task1 has finished, task2 is starting"
}
// ,
tv_2.text = withContext(Dispatchers.Default) {
delay(2000)
"task2 has finished"
}
}
/**
*
*/
private fun requestDirectTwoDataAndUpdateUI() = GlobalScope.launch(Dispatchers.Main){
//
tv_3.visibility = View.VISIBLE
val task1 = async(Dispatchers.Default) {
delay(2000)
"task1 has finished"
}
val task2 = async(Dispatchers.Default) {
delay(2000)
"task2 has finished"
}
tv_3.text = "${task1.await()} + ${task2.await()}"
}
}