Grundlegende Verwendung des Kotlin-Kanals

Der Quellcode von Channel lautet wie folgt:

public interface Channel<E> : SendChannel<E>, ReceiveChannel<E> {
   ...
}
  • Die übergeordnete Klasse von Channel verfügt über SendChannel zum Senden von Nachrichten und ReceiveChannel zum Empfangen von Nachrichten. Kanäle werden in gepufferte und ungepufferte Kanäle unterteilt. Ungepufferte Kanäle senden Elemente, wenn sich Sender und Empfänger treffen. Wenn das Senden zuerst aufgerufen wird, wird es angehalten, bis das Empfangen aufgerufen wird. Wenn das Empfangen zuerst aufgerufen wird, wird es angehalten, bis das Senden aufgerufen wird. Die Factory-Funktion von Channel () sowie der Producer und Actor Builder übergeben eine optionale Parameterkapazität, um die Puffergröße anzugeben. Durch das Puffern kann der Absender mehrere Elemente senden, bevor er angehalten wird. Genau wie die BlockingQueue eine bestimmte Kapazität hat, wird sie blockiert, wenn der Puffer voll ist.

Kanalbau

  • GlobalScope bietet 2 Funktionen produzieren () und Akteur ()

    • Der Rückgabewert von produzieren () ist ein ReceiveChannel-Objekt, und der letzte Parameter ist ein Objekt, das SendChannel erbt. Der Code lautet wie folgt:
      val data = GlobalScope.produce<String> {
             send("a")
         }.receive()
    
    • Der letzte Parameter der function () -Funktion ist ein Objekt, das die ActorScope-Klasse erbt. Die ActorScope-Klasse erbt die ReceiveChannel-Klasse und wird zum Empfangen von Nachrichten verwendet, die von der Verarbeitungsfunktion gesendet werden und ein SendChannel-Objekt zurückgeben. Der Code lautet wie folgt:
     GlobalScope.actor<String> {
             val data = receive()
         }.send("a")
    

    Der Standardwert der zweiten Parameterkapazität von produzieren () und Akteur () ist 0, was bedeutet, dass der Kanal ohne Puffer erstellt wird. Wenn der Wert auf ungefähr 0 neu zugewiesen wird, verfügt der erstellte Kanal über einen Puffer.

    • Verwenden Sie die Funktion iterator () in der Standardbibliothek, um eine ähnliche Pipeline zu erstellen. Verwenden Sie den Iterator, um das Produkt zu ersetzen, den Ertrag zum Senden, den nächsten zum Empfangen und den Iterator, um ReceiveChannel zu ersetzen, um den Coroutine-Bereich zu entfernen. Sie benötigen runBlocking nicht mehr. Code wie folgt anzeigen:
    iterator<String> {
         yield("ss")
     }.next()
    
    • Direktinitialisierungs-, Sende- () und Empfangs- () Funktionen sind Suspend-Funktionen, die nur in Coroutinen oder anderen Suspend-Funktionen aufgerufen werden können. Code wie folgt anzeigen:
     GlobalScope.launch {
         val channel = Channel<String>()
         channel.send("11")
         val data = channel.receive()
     }
    
    **Channel()参数capacity 默认值是0,表示构建的channel是无缓冲区的,若重新赋值为大约0,则构建的channel是有缓冲区的。**
    
  • Timer Channel-- ticker (), der Verwendungscode lautet wie folgt:

 GlobalScope.launch(Dispatchers.Main) {
            val tickerChannle = ticker(1,
             initialDelayMillis = 0)
            tickerChannle.receive()
            tickerChannle.cancel()
        }

Verwenden Sie Channel, um View zu implementieren und wiederholte Klicks zu vermeiden

fun View.setOnceClick(block: suspend () -> Unit) {
   val action = GlobalScope.actor<Unit> {
       for (event in channel){ 
       block()
        delay(2000)//延迟2s
}
   }
   setOnClickListener {
       action.offer(Unit)
   }
}
  • Erweitern Sie eine Funktion setOnceClick () in der View-Klasse, rufen Sie die Klickereignisfunktion der Ansicht in dieser Funktion auf, die Funktion GlobalScope.actor () gibt ein SendChannel-Objekt zurück und rufen Sie die Funktion quote () im Klickereignis auf, um eine Nachricht zu senden .
  • Der letzte Parameter der Actor () -Funktion ist ein Objekt, das die ActorScope-Klasse erbt. Die ActorScope-Klasse erbt die ReceiveChannel-Klasse, um Nachrichten zu akzeptieren, die von der Verarbeitungsfunktion gesendet wurden und ein SendChannel-Objekt zurückgeben.

Ich denke du magst

Origin blog.csdn.net/genmenu/article/details/87630966
Empfohlen
Rangfolge