こんにちはこんにちは、新しいクラスメート。あなたが最終的にこの質問を追求うれしい、多分あなたは明るい偉大な神のコルーチンの異なる理解、いくつかは、いくつかは、それがスレッドより軽いと言う、それはスレッドのフレームワークであると言う、混乱している、私はこのブログはあなたを助けることを願って理解を容易にコルーチンの別のポイントから。
単語、二人の口から語ら説明なしには、すでにそこに変更することができると信じています。公式サイトでは、私たちの最も感動あらゆる必要な技術的なしきい値です。だから、開いてくださいKotlin中国のネットワークを。多くの人がkotlin公式サイトのチュートリアルが非常に詳述されていると言う、それは真実ではない、kotlin中国のネットチュートリアルでは、非常に詳述されています。
トピックに戻ります:
コルーチンとは何ですか?
- 非同期プログラミング
- 経験
- 語学レベル
- 考え
いくつかの重要なポイントと実用上、理解しやすいことに注意してください
Kotlinのコルーチンは、それはあなたがスレッドプールと同じことを実現するが、角度の使用のために、コルーチンができ、達成することができますので、あまり持っていなかったパフォーマンス上の経験を拡張非同期プログラミングフレームワークKotlin文法に基づいていますそして作成するために努力する「同期モード、非同期プログラミング」のアイデアを、開発者として、私たちはより多くの怠惰に、スレッドを切り替えることができ、withContextは、コルーチンは開発上の快適さをもたらしますすることができますが、快適さはKotlinに基づいています文法ではなく、何か他のもの。あなただけのコルーチンを開始し、より多くのビューの言語の観点から理解することがあることを期待私はそう。
だから、それは何コルーチン?
コルーチンは、非同期Kotlinの構文に基づくフレームワークであり、それは心配余計な操作をせずに非同期コードを記述し、同期して開発することができます。それは簡単です
コルーチンは、どのように使用するには?
コルーチンを開始
suspend fun main() {
GlobalScope.launch {
println("启动--${System.currentTimeMillis()}---${Thread.currentThread().name}")
delay(100)
println("挂起100ms--${System.currentTimeMillis()}---${Thread.currentThread().name}")
}
delay(1000)
}
启动--1579085375166---DefaultDispatcher-worker-1
挂起100ms--1579085375275---DefaultDispatcher-worker-1
同時使用
fun main() {
runBlocking(Dispatchers.IO) {
println("启动--${System.currentTimeMillis()}")
val as1 = async {
delay(100)
println("并发1--${System.currentTimeMillis()}---${Thread.currentThread().name}")
"1"
}
val as2 = async {
delay(100)
println("并发2--${System.currentTimeMillis()}---${Thread.currentThread().name}")
"2"
}
println("as1=${as1.await()},as2=${as2.await()}")
}
}
启动--1579085205199
并发1--1579085205313---DefaultDispatcher-worker-3
并发2--1579085205313---DefaultDispatcher-worker-2
as1=1,as2=2
上記デモの業績を観察すると、内部が、それは非同期動作に同期されている方法に見える、非常に快適ではありません。上記のコメントは、一時停止し、それが何を意味するのでしょうか?
何を保留していますか?
印刷ジャーナルの上に観測され、あなたが遅延関数を呼び出すときに我々は、それを見つけ、スレッドと、停止相対的に言って、私たちのコルーチンコードブロックが中断されていなかった、回復を待ちます。唯一の続行するためには、最後の前にコードの私達のコルーチンブロックを機能が実行を一時停止します。図ボロー一つは、以下に説明しました:
だから我々は、非同期コードを書くために、フォームを同期させることができるようにすることを、実際には、いわゆる処理コードレベルを掛けます。
プログラムをノンブロッキング?
所谓的非阻塞,其实就是切换了线程,观察打印日志变化,我们可以发现,当我们直接 GlobalScope.launch 启动一个协程时,此时运行的线程为默认的线程,所以协程被称为非阻塞的实现方式。
suspend关键字的作用
先看下面的图
当使用suspend修饰后的函数我们称其为挂起函数,那么挂起函数有什么作用?为什么test 的suspend 标志是黑的?
继续看截图
挂起函数为什么只能在挂起函数中使用呢??
我们再继续往下看:看一下java字节码
这个 Continuation是什么呢?按照字面意思,意思为延续。那我们该怎么理解呢?
一般来说 Continuation 代表的是<剩余的计算的概念>,也就是 接下来要执行的代码。官方的解释叫做 挂起点
比如我有一段代码:
println("123".length)
最先执行的是"123".length,然后执行 println打印长度,此时执行 “123”.length 就可以当做一个挂起点,也就是代码从这里停止,等待计算出结果,然而此时内部线程却没有停止,当计算完的时候,也就是挂起结束,此时接着执行我们的打印语句。
切换到我们的suspend中,它代表的就是一个标志 的作用,有suspend修饰的代表的函数叫做挂起函数,当编译器碰到这个标志的函数,就知道它是一个可能会耗时的操作。
挂起函数为什么只能在挂起函数中使用呢?
因为普通函数参数并没有带 Continuation啊,相当于没有挂起点,编译器无法判断,所以此时会报错。
为什么test 的suspend 标志是黑的?
コンパイラは、それが機能を停止するであることを知っているが、この場合はそう、コンパイラプロンプト保留中の内部テスト機能、ああはありません。
つまり、この機能はほとんどの役割ではないでしょうか?
そこ役割は、関数呼び出しを中断することができ、この機能を制限することです。
Androidのに使用します
カウントダウン機能
class Main3Activity : AppCompatActivity() {
private val mainScope = CoroutineScope(Dispatchers.Default)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main3)
progressBar.max = 100
mainScope.launch {
(1..100).forEach {
delay(100)
withContext(Dispatchers.Main) {
progressBar.secondaryProgress = it
}
}
}
}
onDestory(){
//记得关闭
}
}
接続詞のViewModelでの使用
class MainViewModel : ViewModel() {
fun test() {
viewModelScope.launch {
}
}
}
ViewModelにキャンセルコルーチンは自動的に閉じますとき
接続詞のライフサイクルでの使用
以下の輸入依存度
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0-rc03"
次のように単にコードの読み取りをカウントダウン:
class Main3Activity : AppCompatActivity() {
....
lifecycleScope.launch {
...
}
}
}
同様に、活性断片または閉じたときには、同様にコルーチンは自動的に閉じられます。
ビューのソースコードは、あなたがまったく同じ方法を達成するために、viewModelScopeおよびライフサイクルlifecycleScopeで、ビューモデルを見つけるでしょう。
マニュアル慎重に我々はサイドからコルーチンを理解するために皆をもたらすために、構文、ユーザの視点から起動しようとすることで最終的にどのようなコルーチンのソースを、追求するあまり上がらないでください、私たちは、誰もが自分自身を理解していることを願って。
あなたは、詳細な調査が必要な場合、我々は以下のブログをお勧めします。