tdc-poa-kotlin channels flow jeziellago · 18 buffered channel channel com buffer de tamanho fixo...

81

Upload: others

Post on 05-Jul-2020

9 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho
Page 2: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

Jeziel Lago/jeziellago @jeziellago

Android Developer | PicPay

InsertKoinIO/koin

coil-kt/coil

Page 3: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

Kotlin Channels & FlowHello Streams!

Page 4: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

vamos dar uma olhada em Java…🤔

4

Antes de falar de Kotlin Channels,

Page 5: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

5

Page 6: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

BlockingQueue 6

java.util.concurrent.BlockingQueue

Page 7: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

7

Page 8: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

8

Page 9: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

Channel

9

BlockingQueue

Page 10: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

10Channels

Page 11: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

Channels 11

Page 12: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

Channels 12

Page 13: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

13

Tipos de Channels

Page 14: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

14

Page 15: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

15

Rendezvous Channel

Channel sem buffer

Uma das funções (send ou receive) sempre fica suspensa até que a outra seja chamada.

Page 16: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

16

Unlimited Channel

Channel com buffer "ilimitado"

Os producers podem enviar elementos para esse canal, e ele crescerá infinitamente. A chamada de envio nunca será suspensa.

Se não houver mais memória, você receberá uma OutOfMemoryException

Page 17: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

17

Conflated Channel

Devolve sempre o elemento mais recente

Page 18: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

18

Buffered Channel

Channel com buffer de tamanho fixo

Os producers podem enviar elementos para este canal até que o limite de tamanho seja atingido.

Quando o buffer estiver cheio, a próxima chamada de envio será suspensa até que apareça mais espaço livre.

O tamanho do buffer é 64 por padrão mas pode ser substituído pela configuração DEFAULT_BUFFER_PROPERTY_NAME via JVM

Page 19: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

19

Na prática…."

Page 20: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

20Qual a saída esperada?

Page 21: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

21Qual a saída esperada?launch1

launch2

channel launch3

Page 22: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

22Qual a saída esperada?launch1

launch2

channel launch3

send “A1"

Page 23: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

23Qual a saída esperada?launch1

launch2

channel launch3

send “A1"

send “B1”

Page 24: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

24Qual a saída esperada?launch1

launch2

channel launch3

send “B1”

receive “A1”

Page 25: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

25Qual a saída esperada?launch1

launch2

channel launch3

A1

send “B1”

println(“A1”)

Page 26: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

26Qual a saída esperada?launch1

launch2

channel launch3

A1

receive “B1”

Page 27: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

27Qual a saída esperada?launch1

launch2

channel launch3

A1, B1

println(“B1”)

Page 28: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

28Qual a saída esperada?launch1

launch2

channel launch3

A1, B1

send “A2”

Page 29: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

29Qual a saída esperada?launch1

launch2

channel launch3

A1, B1

send “A2”

send “B2”

Page 30: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

30Qual a saída esperada?launch1

launch2

channel launch3

A1, B1

send “B2”

receive “A2”

Page 31: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

31Qual a saída esperada?launch1

launch2

channel launch3

A1, B1, A2

send “B2”

println(“A2”)

Page 32: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

32Qual a saída esperada?launch1

launch2

channel launch3

A1, B1, A2

receive “B2”

Page 33: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

33Qual a saída esperada?launch1

launch2

channel launch3

A1, B1, A2, B2

println(“B2”)

Page 34: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

34Qual a saída esperada?launch1

launch2

channel launch3

A1, B1, A2, B2

Page 35: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

35Qual a saída esperada?launch1

launch2

channel launch3

Page 36: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

36Qual a saída esperada?launch1

launch2

channel launch3

send “A1”

Page 37: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

37Qual a saída esperada?launch1

launch2

channel launch3

Buffer = [“A1”]

Page 38: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

38Qual a saída esperada?launch1

launch2

channel launch3

Buffer = [“A1”] send “A2”

Page 39: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

39Qual a saída esperada?launch1

launch2

channel launch3

Buffer = [“A1”,“A2”]

Page 40: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

40Qual a saída esperada?launch1

launch2

channel launch3

Buffer = [“A1”,“A2”]

send “B1”

Page 41: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

41Qual a saída esperada?launch1

launch2

channel launch3

Buffer = [“A1”,“A2”,”B1”]

Page 42: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

42Qual a saída esperada?launch1

launch2

channel launch3

Buffer = [“A1”,“A2”,”B1”]

send “B2”

Page 43: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

43Qual a saída esperada?launch1

launch2

channel launch3

Buffer = [“A1”,“A2”,”B1”,”B2”]

Page 44: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

44Qual a saída esperada?launch1

launch2

channel launch3

Buffer = [“A2”,”B1”,”B2”]

receive “A1”

Page 45: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

45Qual a saída esperada?launch1

launch2

channel launch3

A1

Buffer = [“A2”,”B1”,”B2”]

println(“A1”)

Page 46: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

46Qual a saída esperada?launch1

launch2

channel launch3

A1

Buffer = [”B1”,”B2”]

receive “A2”

Page 47: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

47Qual a saída esperada?launch1

launch2

channel launch3

A1, A2

Buffer = [”B1”,”B2”]

println(“A2”)

Page 48: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

48Qual a saída esperada?launch1

launch2

channel launch3

A1, A2

receive “B1”

Buffer = [”B2”]

Page 49: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

49Qual a saída esperada?launch1

launch2

channel launch3

A1, A2, B1

Buffer = [”B2”]

println(“B1”)

Page 50: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

50Qual a saída esperada?launch1

launch2

channel launch3

A1, A2, B1

receive “B2”

Buffer = []

Page 51: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

51Qual a saída esperada?launch1

launch2

channel launch3

A1, A2, B1, B2

Buffer = []

println(“B2”)

Page 52: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

52Qual a saída esperada?launch1

launch2

channel launch3

A1, A2, B1, B2

Page 53: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

53

Channels podem ser fechados para indicar que não há mais elementos chegando.

Page 54: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

54

ClosedReceiveChannelException: Channel was closed

println(5)

Channel Conflated emite o item mais recente

Page 55: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

55

Channel & Coroutines Coroutine builder + channel + extension functions

Producers

Consumers

Page 56: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

56

1. Channels são ótimos para modelar fontes de dados quentes

Algumas considerações…

2. Deve-se usar um channel quando precisar enviar dados de uma coroutine para outra

a) coroutines são concorrentes b) precisamos de sincronização para trabalhar com qualquer dado na presença de concorrência.

Page 57: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

57

Mas e se não precisarmos de concorrência ou

sincronização, mas apenas de fluxos de dados sem

bloqueio?

😟

Page 58: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

58

Seja bem-vindo ao Kotlin Flow!

😎

Page 59: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

59

Um flow é um stream “frio” de valores

myFlow é apenas a referência da instância do Flow

O código dentro do flow{…} não está ativo e

ainda não há recursos vinculados a ele. %

Page 60: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

60

Flow possui duas operações principais

Flowemit(…) collect{…}

Page 61: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

61

Algumas maneiras de criar um Flow

flow{…} flowOf(…) .asFlow()

Page 62: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

62

Flows podem ser transformados usando alguns operadores

Page 63: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

63

Alguns listeners de “eventos”

Page 64: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

64

Coroutine context & FlowUse flowOn para especificar o contexto de execução.

Page 65: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

65

Coroutine context & FlowUse flowOn para especificar o contexto de execução.

Trecho executado com Dispatchers.IO

Page 66: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

66

Coroutine context & FlowUse flowOn para especificar o contexto de execução.

Trecho executado com Dispatchers.Default

Page 67: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

67

Coroutine context & FlowUse flowOn para especificar o contexto de execução.

Trecho executado no contexto de quem chamar o collect

Page 72: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

72

Wrapping callbacks com callbackFlow

Page 73: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

73

Wrapping callbacks com callbackFlow

Page 74: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

74

Wrapping callbacks com callbackFlow

Page 75: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

75

Wrapping callbacks com callbackFlow

Page 76: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

76

Wrapping callbacks com callbackFlow

Page 77: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

77

Wrapping callbacks com callbackFlow

Page 78: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

78

Considerações Finais ✍

Channel & Flow podem andar juntos

Migração tranquila de RxJava/RxKotlin/RxAndroid para Channel & Flow

Nova versão do Room e WorkManager já usam Flow

API ainda Experimental

Page 80: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

Jeziel Lago

/jeziellago @jeziellago

Android Developer | PicPay

Obrigado!

Page 81: TDC-POA-Kotlin Channels Flow JezielLago · 18 Buffered Channel Channel com buffer de tamanho fixo Os producers podem enviar elementos para este canal até que o limite de tamanho

81

Linkshttp://tutorials.jenkov.com/java-util-concurrent/blockingqueue.html

https://medium.com/@elizarov/reactive-streams-and-kotlin-flows-bfd12772cda4

https://medium.com/@elizarov/simple-design-of-kotlin-flow-4725e7398c4c

https://medium.com/@elizarov/execution-context-of-kotlin-flows-b8c151c9309b

https://medium.com/@elizarov/cold-flows-hot-channels-d74769805f9#9f07

https://proandroiddev.com/what-is-concurrent-access-to-mutable-state-f386e5cb8292

https://play.kotlinlang.org/hands-on/Introduction%20to%20Coroutines%20and%20Channels/01_Introduction

https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/