Channelのソースコードは次のとおりです。
public interface Channel<E> : SendChannel<E>, ReceiveChannel<E> {
...
}
- Channelの親クラスには、メッセージを送信するためのSendChannelとメッセージを受信するためのReceiveChannelがあります。チャネルはバッファ付きチャネルとバッファなしチャネルに分けられます。バッファなしチャネルは、送信者と受信者が出会ったときに要素を送信します。送信が最初に呼び出された場合、受信が呼び出されるまで一時停止されます。受信が最初に呼び出された場合、送信が呼び出されるまで一時停止されます。Channel()ファクトリ関数とプロデュースおよびアクタービルダーは、バッファーサイズを指定するためのオプションのパラメーター容量を渡します。バッファリングにより、送信者は一時停止される前に複数の要素を送信できます。これは、BlockingQueueに指定された容量があるのと同様に、バッファがいっぱいになるとブロッキングが発生します。
チャネル構築
-
GlobalScopeは、produce()とactor()の2つの関数を提供します
- produce()の戻り値はReceiveChannelオブジェクトであり、最後のパラメーターはSendChannelを継承するオブジェクトです。コードは次のとおりです。
val data = GlobalScope.produce<String> { send("a") }.receive()
- アクター()関数の最後のパラメーターは、ActorScopeクラスを継承するオブジェクトです。ActorScopeクラスは、ReceiveChannelクラスを継承し、SendChannelオブジェクトを返す処理関数によって送信されるメッセージを受信するために使用されます。コードは次のとおりです。
GlobalScope.actor<String> { val data = receive() }.send("a")
produce()とactor()の2番目のパラメータ容量のデフォルト値は0です。これは、チャネルがバッファなしで構築されることを意味します。値が約0に再割り当てされると、構築されるチャネルにバッファがあります。
- 標準ライブラリのiterator()関数を使用して、同様のパイプラインを構築します。イテレータを使用して、produce、yieldを送信、next to receiveを置き換え、IteratorをReceiveChannelを置き換えて、コルーチンスコープを削除します。runBlockingは不要になります。コードは次のように表示されます。
iterator<String> { yield("ss") }.next()
- 直接初期化、send()およびreceive()関数はサスペンド関数であり、コルーチンまたは他のサスペンド関数でのみ呼び出すことができます。コードは次のように表示されます。
GlobalScope.launch { val channel = Channel<String>() channel.send("11") val data = channel.receive() }
**Channel()参数capacity 默认值是0,表示构建的channel是无缓冲区的,若重新赋值为大约0,则构建的channel是有缓冲区的。**
-
タイマーチャネル-ティッカー()、使用コードは次のとおりです。
GlobalScope.launch(Dispatchers.Main) {
val tickerChannle = ticker(1,
initialDelayMillis = 0)
tickerChannle.receive()
tickerChannle.cancel()
}
チャネルを使用してビューを実装し、繰り返しクリックを防止します
fun View.setOnceClick(block: suspend () -> Unit) {
val action = GlobalScope.actor<Unit> {
for (event in channel){
block()
delay(2000)//延迟2s
}
}
setOnClickListener {
action.offer(Unit)
}
}
- Viewクラスの関数setOnceClick()を拡張し、この関数でViewのクリックイベント関数を呼び出します。GlobalScope.actor()関数はSendChannelオブジェクトを返し、クリックイベントでoffer()関数を呼び出してメッセージを送信します。 。
- アクター()関数の最後のパラメーターは、ActorScopeクラスを継承するオブジェクトです。ActorScopeクラスは、SendChannelオブジェクトを返す処理関数によって送信されたメッセージを受け入れるためにReceiveChannelクラスを継承します。