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スレッドは戻ってきたデータ
  • をロードする.
    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()}"
        }
    }