mvvm com rxjava com kotlin

29
MVVM com RxJava em Kotlin no Android

Upload: gdgfoz

Post on 22-Jan-2018

81 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: MVVM com RxJava com Kotlin

MVVM com RxJava em Kotlin no Android

Page 2: MVVM com RxJava com Kotlin

GDGFoz

Quem ?• Houssan Ali Hijazi - [email protected]

• Desenvolvedor Android na www.HElabs.com

• Organizador GDG Foz do Iguaçu

• www.lojasnoparaguai.com.br

• www.desaparecidosbr.org

• www.hussan.com.br

Page 3: MVVM com RxJava com Kotlin

GDGFoz

Kotlin

• 2011/JetBrains

• 1.0 em Fev. 2016

• 1.1 em Mar. 2017

• Pinterest, Coursera, Netflix, Uber, Square, Trello e Basecamp

• 17/Maio - Google IO 2017

Page 4: MVVM com RxJava com Kotlin

GDGFoz

Kotlin

• Interoperabilidade

• Null Safety

• Conciso

Page 5: MVVM com RxJava com Kotlin

GDGFoz

Manifesto reativo

• Responsivo - Reagir rápido

• Resiliente - Reagir a falhas

• Elástico - Reagir a carga / Autoescalar

• Orientado a mensagens - Comunicação assíncrona

Fonte: https://www.reactivemanifesto.org/pt-BR

Page 6: MVVM com RxJava com Kotlin

GDGFoz

RxJava

• RxJava - Reactive Extensions para a JVM - uma

biblioteca para compor programas assíncronos e

baseados em eventos usando sequências

observáveis.

• Netflix

• 1.0.0 em 18 Nov 2014

• 2.0.0 em 28 Out 2016

Page 7: MVVM com RxJava com Kotlin

GDGFoz

RxJava

Observable

Disposable

subscribe(Observer<T>)

Emite

Observer

onNext(T)

onComplete()

onError(Throwable)Consome

Page 8: MVVM com RxJava com Kotlin

GDGFoz

RxJava

• Observable - Emite dados

• Observer - Consome dados

• Disposable

• Operators: map, flatmap, filter, last, first etc..

• Schedulers

Page 9: MVVM com RxJava com Kotlin

GDGFoz

Código

• Robusto

• Estável

• Testável

• Modular

Page 10: MVVM com RxJava com Kotlin

GDGFoz

Model/View/Controller

Activity

IView

Page 11: MVVM com RxJava com Kotlin

GDGFoz

Model/View/Presenter

Contract

Page 12: MVVM com RxJava com Kotlin

GDGFoz

App

Page 13: MVVM com RxJava com Kotlin

GDGFoz

Model/View/Presenter// View contract

interface RepositoriesContract{

interface View{

fun setRepositories(repositories: List<Repository>)

}

}

// Activity/Fragment

class RepositoriesActivity : AppCompatActivity(), RepositoriesContract.View {

...

// Passing the View to Presenter

presenter = RepositoriesPresenter(this)

override fun setRepositories(repositories: List<Repository>) {

// Setting data to view

}

Page 14: MVVM com RxJava com Kotlin

GDGFoz

Model/View/Presenter// Presenter contract

interface RepositoriesContract {

interface Presenter {

fun getAllRepositories()

}

}

// Passing View to Presenter

class RepositoriesPresenter(val view: RepositoriesContract.View): RepositoriesContract.Presenter

lateinit var model: RepositoryModel

override fun getAllRepositories() {

// Call model and set data to View

// Can be RxJava

var repositories:List<Repository> = model.getAllRepositories()

view.setRepositories(repositories)

}

Page 15: MVVM com RxJava com Kotlin

GDGFoz

Model/View/ViewModel

• Microsoft

• 2005

• Orientado à eventos

Page 16: MVVM com RxJava com Kotlin

GDGFoz

Model/View/ViewModel

Page 17: MVVM com RxJava com Kotlin

GDGFoz

MVVM// ViewModelclass RepositoriesViewModel(var model: RepositoryDataSource) {

...

fun getAllRepositories() {

// Return an Observable

fun getAllRepositories(): Observable<List<Repository>> = model.getAllRepositories()

}

Page 18: MVVM com RxJava com Kotlin

GDGFoz

MVVM// Activity/Fragment

class RepositoriesActivity : AppCompatActivity() {

private val viewModel: RepositoriesViewModel by lazy {RepositoriesViewModel(RepositoryModel())

}

private val mDisposable = CompositeDisposable()...

Page 19: MVVM com RxJava com Kotlin

GDGFoz

MVVM

// Activity/Fragment

override fun onCreate(savedInstanceState: Bundle?) {

...

mDisposable.add(

viewModel.getAllRepositories()

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(

// onNext

this::setRepositories,

// onError

{ error -> Log.d(TAG, "Error: ", error) },

// onComplete

{ Log.d(TAG, "Completed: ") }

)

)

// Activity/Fragment

fun setRepositories(repositories: List<Repository>) {

// Setting data to view

}

Page 20: MVVM com RxJava com Kotlin

GDGFoz

Android lifecycle

// Activity/Fragment

override fun onDestroy() {

super.onDestroy()

mDisposable.dispose()

}

Page 21: MVVM com RxJava com Kotlin

GDGFoz

MVP/MVVMclass Presenter: IPresenter {

override fun getAllRepositories() {

...

view.setRepositories(repositories)

}

}

class ViewModel {

fun getAllRepositories(): Observable<List<Repository>> {

...

}

}

Page 22: MVVM com RxJava com Kotlin

GDGFoz

MVVM testsclass RepositoriesViewModelTest {

@Mock

lateinit var model: RepositoryDataSource

lateinit var viewModel: RepositoriesViewModel

@Before

fun setup()

{

model = mock()

viewModel = RepositoriesViewModel(model)

}

Page 23: MVVM com RxJava com Kotlin

GDGFoz

MVVM tests@Test

fun `get repositories emit correct values`() {

val repositories = listOf(Repository(name = "Test"), Repository(name = "Test2"

`when`(model.getAllRepositories()).thenReturn(Observable.just(repositories))

viewModel.getAllRepositories()

.test()

.assertNoErrors()

.assertComplete()

.assertValue(repositories)

}

Page 24: MVVM com RxJava com Kotlin

GDGFoz

Save states

// Save

override fun onSaveInstanceState(state: Bundle?) {

super.onSaveInstanceState(state)

//Can create Bundle here

state.putAll(viewModel.getState())

}

// Restore

override fun onRestoreInstanceState(bundle: Bundle) {

super.onRestoreInstanceState(bundle)

viewModel.restoreState(bundle)

}

Page 25: MVVM com RxJava com Kotlin

GDGFoz

Activity

Fragment

CustomView

CustomView

P / VM

View

Page 26: MVVM com RxJava com Kotlin

GDGFoz

Lógica de UI ?

• Tem lógica de UI ?

• Sim - Presenter/ViewModel (Testes)

• Não - View

Page 27: MVVM com RxJava com Kotlin

GDGFoz

Qual ?

• Classes Android sem lógica ?

• Pode ser testado (unit test) ?

• Suas classes tem uma responsabilidade bem definida ?

Page 28: MVVM com RxJava com Kotlin

GDGFoz

Links

• http://reactivex.io/

• https://github.com/ReactiveX/RxJava/

• https://kotlinlang.org/

• https://medium.com/upday-devs/android-architecture-patterns-part-3-model-view-viewmodel-e7eeee76b73b

• https://github.com/googlesamples/android-architecture

• https://github.com/hussanhijazi/retrofit-rxjava-databinding/tree/kotlin-mvvm

Page 29: MVVM com RxJava com Kotlin

Obrigado