Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

Jeziel Lago /jeziellago @jeziellago Android Developer | PicPay

Slide 3

Slide 3 text

Kotlin Channels & Flow

Slide 4

Slide 4 text

vamos dar uma olhada em Java… 4 Antes de falar de Kotlin Channels,

Slide 5

Slide 5 text

5

Slide 6

Slide 6 text

BlockingQueue 6 java.util.concurrent.BlockingQueue

Slide 7

Slide 7 text

7

Slide 8

Slide 8 text

8

Slide 9

Slide 9 text

Channel 9 BlockingQueue

Slide 10

Slide 10 text

10 Channels

Slide 11

Slide 11 text

Channels 11

Slide 12

Slide 12 text

Channels 12

Slide 13

Slide 13 text

13 Tipos de Channels

Slide 14

Slide 14 text

14

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

17 Conflated Channel Devolve sempre o elemento mais recente

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

19 Na prática….

Slide 20

Slide 20 text

20 Qual a saída esperada?

Slide 21

Slide 21 text

21 Qual a saída esperada? launch1 launch2 channel launch3

Slide 22

Slide 22 text

22 Qual a saída esperada? launch1 launch2 channel launch3 send “A1"

Slide 23

Slide 23 text

23 Qual a saída esperada? launch1 launch2 channel launch3 send “A1" send “B1”

Slide 24

Slide 24 text

24 Qual a saída esperada? launch1 launch2 channel launch3 send “B1” receive “A1”

Slide 25

Slide 25 text

25 Qual a saída esperada? launch1 launch2 channel launch3 A1 send “B1” println(“A1”)

Slide 26

Slide 26 text

26 Qual a saída esperada? launch1 launch2 channel launch3 A1 receive “B1”

Slide 27

Slide 27 text

27 Qual a saída esperada? launch1 launch2 channel launch3 A1, B1 println(“B1”)

Slide 28

Slide 28 text

28 Qual a saída esperada? launch1 launch2 channel launch3 A1, B1 send “A2”

Slide 29

Slide 29 text

29 Qual a saída esperada? launch1 launch2 channel launch3 A1, B1 send “A2” send “B2”

Slide 30

Slide 30 text

30 Qual a saída esperada? launch1 launch2 channel launch3 A1, B1 send “B2” receive “A2”

Slide 31

Slide 31 text

31 Qual a saída esperada? launch1 launch2 channel launch3 A1, B1, A2 send “B2” println(“A2”)

Slide 32

Slide 32 text

32 Qual a saída esperada? launch1 launch2 channel launch3 A1, B1, A2 receive “B2”

Slide 33

Slide 33 text

33 Qual a saída esperada? launch1 launch2 channel launch3 A1, B1, A2, B2 println(“B2”)

Slide 34

Slide 34 text

34 Qual a saída esperada? launch1 launch2 channel launch3 A1, B1, A2, B2

Slide 35

Slide 35 text

35 Qual a saída esperada? launch1 launch2 channel launch3

Slide 36

Slide 36 text

36 Qual a saída esperada? launch1 launch2 channel launch3 send “A1”

Slide 37

Slide 37 text

37 Qual a saída esperada? launch1 launch2 channel launch3 Buffer = [“A1”]

Slide 38

Slide 38 text

38 Qual a saída esperada? launch1 launch2 channel launch3 Buffer = [“A1”] send “A2”

Slide 39

Slide 39 text

39 Qual a saída esperada? launch1 launch2 channel launch3 Buffer = [“A1”,“A2”]

Slide 40

Slide 40 text

40 Qual a saída esperada? launch1 launch2 channel launch3 Buffer = [“A1”,“A2”] send “B1”

Slide 41

Slide 41 text

41 Qual a saída esperada? launch1 launch2 channel launch3 Buffer = [“A1”,“A2”,”B1”]

Slide 42

Slide 42 text

42 Qual a saída esperada? launch1 launch2 channel launch3 Buffer = [“A1”,“A2”,”B1”] send “B2”

Slide 43

Slide 43 text

43 Qual a saída esperada? launch1 launch2 channel launch3 Buffer = [“A1”,“A2”,”B1”,”B2”]

Slide 44

Slide 44 text

44 Qual a saída esperada? launch1 launch2 channel launch3 Buffer = [“A2”,”B1”,”B2”] receive “A1”

Slide 45

Slide 45 text

45 Qual a saída esperada? launch1 launch2 channel launch3 A1 Buffer = [“A2”,”B1”,”B2”] println(“A1”)

Slide 46

Slide 46 text

46 Qual a saída esperada? launch1 launch2 channel launch3 A1 Buffer = [”B1”,”B2”] receive “A2”

Slide 47

Slide 47 text

47 Qual a saída esperada? launch1 launch2 channel launch3 A1, A2 Buffer = [”B1”,”B2”] println(“A2”)

Slide 48

Slide 48 text

48 Qual a saída esperada? launch1 launch2 channel launch3 A1, A2 receive “B1” Buffer = [”B2”]

Slide 49

Slide 49 text

49 Qual a saída esperada? launch1 launch2 channel launch3 A1, A2, B1 Buffer = [”B2”] println(“B1”)

Slide 50

Slide 50 text

50 Qual a saída esperada? launch1 launch2 channel launch3 A1, A2, B1 receive “B2” Buffer = []

Slide 51

Slide 51 text

51 Qual a saída esperada? launch1 launch2 channel launch3 A1, A2, B1, B2 Buffer = [] println(“B2”)

Slide 52

Slide 52 text

52 Qual a saída esperada? launch1 launch2 channel launch3 A1, A2, B1, B2

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

54 ClosedReceiveChannelException: Channel was closed println(5) Channel Conflated emite o item mais recente

Slide 55

Slide 55 text

55 Channel & Coroutines Coroutine builder + channel + extension functions Producers Consumers

Slide 56

Slide 56 text

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.

Slide 57

Slide 57 text

57 Mas e se não precisarmos de concorrência ou sincronização, mas apenas de fluxos de dados sem bloqueio?

Slide 58

Slide 58 text

58 Sejam bem-vindos ao Kotlin Flow!

Slide 59

Slide 59 text

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.

Slide 60

Slide 60 text

60 Flow possui duas operações principais Flow emit(…) collect{…}

Slide 61

Slide 61 text

61 Algumas maneiras de criar um Flow flow{…} flowOf(…) .asFlow()

Slide 62

Slide 62 text

62 Flows podem ser transformados usando alguns operadores

Slide 63

Slide 63 text

63 Alguns listeners de “eventos”

Slide 64

Slide 64 text

64 Coroutine context & Flow Use flowOn para especificar o contexto de execução.

Slide 65

Slide 65 text

65 Coroutine context & Flow Use flowOn para especificar o contexto de execução. Trecho executado com Dispatchers.IO

Slide 66

Slide 66 text

66 Coroutine context & Flow Use flowOn para especificar o contexto de execução. Trecho executado com Dispatchers.Default

Slide 67

Slide 67 text

67 Coroutine context & Flow Use flowOn para especificar o contexto de execução. Trecho executado no contexto de quem chamar o collect

Slide 68

Slide 68 text

68 Exemplos

Slide 69

Slide 69 text

69 Exemplos

Slide 70

Slide 70 text

70 Wrapping callbacks com callbackFlow

Slide 71

Slide 71 text

71 Wrapping callbacks com callbackFlow

Slide 72

Slide 72 text

72 Wrapping callbacks com callbackFlow

Slide 73

Slide 73 text

73 Wrapping callbacks com callbackFlow

Slide 74

Slide 74 text

74 Wrapping callbacks com callbackFlow

Slide 75

Slide 75 text

75 Wrapping callbacks com callbackFlow

Slide 76

Slide 76 text

76 …mas e testes?

Slide 77

Slide 77 text

77

Slide 78

Slide 78 text

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á tem suporte para Flow API ainda Experimental

Slide 79

Slide 79 text

79 Dúvidas?

Slide 80

Slide 80 text

Jeziel Lago /jeziellago @jeziellago Android Developer | PicPay Obrigado!

Slide 81

Slide 81 text

81 Links http://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/