Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

231
Visualizações
Ignorar ofertas a canales coroutine después del cierre

¿Hay una buena manera de que los canales ignoren las ofertas una vez cerradas sin generar una excepción?

Actualmente, parece que solo Try Catch funcionaría, ya que isClosedForSend no es atómico.

Alternativamente, ¿hay algún problema si simplemente nunca cierro un canal? Para mi caso de uso específico, estoy usando canales como una alternativa a los datos en vivo de Android (ya que no necesito ninguno de los beneficios más allá de enviar valores desde cualquier hilo y escuchar desde el hilo principal). En ese caso, podría escuchar el canal a través de un productor que solo envía valores cuando yo quiero y simplemente ignorar todas las demás entradas.

Idealmente, tendría una solución en la que ReceiveChannel todavía puede terminar de escuchar, pero donde SendChannel nunca fallará cuando se le ofrezca un nuevo valor.

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Los canales lanzan esta excepción por diseño , como medio de comunicación correcta.

Si absolutamente debe tener algo como esto, puede usar una función de extensión de este tipo:

 private suspend fun <E> Channel<E>.sendOrNothing(e: E) { try { this.send(e) } catch (closedException: ClosedSendChannelException) { println("It's fine") } }

Puedes probarlo con el siguiente fragmento de código:

 val channel = Channel<Int>(capacity = 3) launch { try { for (i in 1..10) { channel.sendOrNothing(i) delay(50) if (i == 5) { channel.close() } } println("Done") } catch (e: Exception) { e.printStackTrace() } finally { println("Finally") } } launch { for (c in channel) { println(c) delay(300) } }

Como notará, el productor comenzará a imprimir "Está bien" ya que el canal está cerrado, pero el consumidor aún podrá leer los primeros 5 valores.

En cuanto a tu segunda pregunta: depende.

Los canales no tienen una sobrecarga tan grande, y tampoco las rutinas suspendidas. Pero una fuga es una fuga, ya sabes.

over 4 years ago · Santiago Trujillo Relatório

0

Terminé publicando un problema en el repositorio y la solución fue usar BroadcastChannel . Puede crear un nuevo ReceiveChannel a través de openSubscription , donde cerrarlo no cerrará SendChannel .

Esto refleja con mayor precisión el PublishSubject de PublishSubject

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda