何Kotlin-コルーチンこと?

こんにちはこんにちは、新しいクラスメート。あなたが最終的にこの質問を追求うれしい、多分あなたは明るい偉大な神のコルーチンの異なる理解、いくつかは、いくつかは、それがスレッドより軽いと言う、それはスレッドのフレームワークであると言う、混乱している、私はこのブログはあなたを助けることを願って理解を容易にコルーチンの別のポイントから。

単語、二人の口から語ら説明なしには、すでにそこに変更することができると信じています。公式サイトでは、私たちの最も感動あらゆる必要な技術的なしきい値です。だから、開いてくださいKotlin中国のネットワークを多くの人がkotlin公式サイトのチュートリアルが非常に詳述されていると言う、それは真実ではない、kotlin中国のネットチュートリアルでは、非常に詳述されています。

トピックに戻ります:

コルーチンとは何ですか?

画像-20200115165921441

  • 非同期プログラミング
  • 経験
  • 語学レベル
  • 考え

いくつかの重要なポイントと実用上、理解しやすいことに注意してください

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

上記デモの業績を観察すると、内部が、それは非同期動作に同期されている方法に見える、非常に快適ではありません。上記のコメントは、一時停止し、それが何を意味するのでしょうか?


何を保留していますか?

印刷ジャーナルの上に観測され、あなたが遅延関数を呼び出すときに我々は、それを見つけ、スレッドと、停止相対的に言って、私たちのコルーチンコードブロックが中断されていなかった、回復を待ちます。唯一の続行するためには、最後の前にコードの私達のコルーチンブロックを機能が実行を一時停止します。図ボロー一つは、以下に説明しました:

IMG

だから我々は、非同期コードを書くために、フォームを同期させることができるようにすることを、実際には、いわゆる処理コードレベルを掛けます。


プログラムをノンブロッキング?

所谓的非阻塞,其实就是切换了线程,观察打印日志变化,我们可以发现,当我们直接 GlobalScope.launch 启动一个协程时,此时运行的线程为默认的线程,所以协程被称为非阻塞的实现方式。


suspend关键字的作用

先看下面的图
画像-20200115191719199

当使用suspend修饰后的函数我们称其为挂起函数,那么挂起函数有什么作用?为什么test 的suspend 标志是黑的?

继续看截图

画像-20200115192201091

挂起函数为什么只能在挂起函数中使用呢??

我们再继续往下看:看一下java字节码

画像-20200115193946330

这个 Continuation是什么呢?按照字面意思,意思为延续。那我们该怎么理解呢?

一般来说 Continuation 代表的是<剩余的计算的概念>,也就是 接下来要执行的代码。官方的解释叫做 挂起点

比如我有一段代码:

println("123".length)

最先执行的是"123".length,然后执行 println打印长度,此时执行 “123”.length 就可以当做一个挂起点,也就是代码从这里停止,等待计算出结果,然而此时内部线程却没有停止,当计算完的时候,也就是挂起结束,此时接着执行我们的打印语句。

切换到我们的suspend中,它代表的就是一个标志 的作用,有suspend修饰的代表的函数叫做挂起函数,当编译器碰到这个标志的函数,就知道它是一个可能会耗时的操作。

挂起函数为什么只能在挂起函数中使用呢?

画像-20200115200403816

因为普通函数参数并没有带 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(){
    //记得关闭
  }
  
}

Jietu20200115-203101-HD


接続詞の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で、ビューモデルを見つけるでしょう。

画像-20200115204534210

マニュアル慎重に我々はサイドからコルーチンを理解するために皆をもたらすために、構文、ユーザの視点から起動しようとすることで最終的にどのようなコルーチンのソースを、追求するあまり上がらないでください、私たちは、誰もが自分自身を理解していることを願って。

あなたは、詳細な調査が必要な場合、我々は以下のブログをお勧めします。

Beenyhuo

公開された96元の記事 ウォンの賞賛643 ・は 90000 +を見て

おすすめ

転載: blog.csdn.net/petterp/article/details/103995998