SlideShare une entreprise Scribd logo
1  sur  54
Télécharger pour lire hors ligne
Dagger 2
uso avançado em projetos Android
DI - Dependency Injection
Não crie, peça
Dependa de abstrações, não dependa
de classes concretas
Abstração x Concreto
Abstração x Concreto
AVISO!
Cuidado com a quantidade
de interfaces!
Dagger 2
Qualifiers
Qualifiers - por quê?
Diferenciação de dependências de
mesmo tipo / classe
Qualifiers - como?
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiUrl {
}
@Module
public class QualifiedModule {
@Provides
@ApiUrl
public String provideApiUrl() {
return "https://api.stackexchange.com/2.2/";
}
@Provides
public String provideUnqualified() {
return "Android!";
}
}
public class InjectedClass {
@Inject
String value;
@Inject
@ApiUrl
String url;
...
@Module
public class AnotherModule {
@Provides
public MyClass provideClass(String value,
@ApiUrl String url) {
return new MyClass(value, url);
}
...
Qualifiers - extras
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface Named {
String value() default "";
}
@Module
public class QualifiedModule {
@Provides
@Named("One")
public String provideV1() {
return "one!";
}
@Provides
@Named("Two")
public String provideV2() {
return "two!";
}
}
public class InjectedClass {
@Inject
@Named("One")
String value1; // one!
@Inject
@Named("Two")
String value2; // two!
...
Qualifiers - extras
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface ComplexQualifier {
String value() default "";
int ordinal() default 1;
}
Dagger 2
Custom Scopes
Custom Scopes - por quê?
Ciclo de vida de um objeto dentro de um
escopo
É uma espécie de “Singleton local”
Custom Scopes - como?
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityScope {
}
@Module
public class ScopedModule {
@Provides
@ActivityScope
public MyObject provideDependency() {
// Singleton on this scope
}
@Provides
public MyOtherObject provideOtherDependency() {
// Each request, a new object
}
}
Custom Scopes - como?
@ActivityScope
@SubComponent(modules = ScopedModule.class)
public interface ActivityComponent {
...
}
Custom Scopes - como?
@Singleton
@Component(...)
public interface MainComponent {
ActivityComponent plus();
}
Custom Scopes - como?
@Singleton
@Component(...)
public interface MainComponent {
ActivityComponent plus();
// Shared dependency
Application getApplication();
}
Custom Scopes - como?
@Singleton
@Component(...)
public interface MainComponent {
// If module has no default constructor
ActivityComponent plus(CustomModule m);
}
Custom Scopes - como?
ActivityComponent activityComponent =
mainComponent.plus();
// ou
ActivityComponent activityComponent =
mainComponent.plus(new MyModule(ctx));
Custom Scopes - importante
É importante sempre gerenciar o ciclo
de vida do componente de acordo com
o escopo desejado para evitar leaks
Explicitamente:
activityComponent = null;
Pro Tip: Escopo @Reusable
Escopo @Reusable
Otimização para dependências que
podem ser reutilizadas mas não
precisam necessariamente ser a mesma
instância.
Muito útil para Utils e Helpers
Disponível a partir da versão 2.3
Dagger 2
Multibindings
Multibindings - por quê?
Dependências que só fazem sentido
juntas
São entregues juntas dentro de uma
collection - Map ou Set
@Module
public class MultibindingsSetModule {
@Provides
@IntoSet
public String provideFirstValue() {
return "One!";
}
@Provides
@IntoSet
public String provideSecondValue() {
return "Two!";
}
}
public class InjectedClass {
@Inject
Set<String> values; // One!, Two!
...
@Module
public class MultibindingsMapModule {
@Provides
@IntoMap
@StringKey("key1")
public String provideFirstValue() {
return "One!";
}
@Provides
@IntoMap
@StringKey("key2")
public String provideSecondValue() {
return "Two!";
}
public class InjectedClass {
@Inject
Map<String, String> values;
// key1 => One!
// key2 =: Two!
...
Multibindings - Maps
As chaves podem ser:
IntKey
LongKey
StringKey
ClassKey
Multibindings - Dica
Caso a coleção possa, por algum motivo, ficar vazia,
precisamos de um módulo abstrato declarando a
coleção.
@Module
public abstract class MyModule {
@Multibinds
public abstract Set<String> possiblyEmpty();
}
Dagger 2
Binds
Binds - por quê?
Servem para ligar interfaces a
implementações dentro de um módulo
abstrato
É um excelente aliado na criação de
módulos de teste e na substituição de
objetos reais por mocks
@Module
public abstract class BindModule {
@Binds
abstract Bluetooth provideBluetooth(BluetoothImpl impl);
...
}
@Module
public class ConcreteModule {
@Provides
BluetoothImpl provideBluetoothImpl() {
return new BluetoothImpl();
}
}
@Module
public abstract class BindTestModule {
@Binds
abstract Bluetooth provideBluetooth(BluetoothMock mock);
...
}
@Module
public class ConcreteTestModule {
@Provides
BluetoothMock provideBluetoothMock() {
return new BluetoothMock();
}
}
Dagger 2
Producers
Producers - por quê?
São praticamente uma biblioteca à parte
- de fato, são uma dependência à parte :)
É uma API para a injeção de
dependência de forma assíncrona, ideal
para dependências muito pesadas ou de
inicialização lenta.
Producers - avisos
Não segue o padrão da JSR-330 - não
usa anotações @Inject, por exemplo
Adiciona o Guava ao classpath do
projeto, o que pode engordar o APK e
contribuir para aumento do número de
métodos… #MultidexDanger
Producers - passo 1 (Executor)
@Module
public class ExecutorModule {
@Provides
@Production
public Executor provideExecutor() {
return Executors.newCachedThreadPool();
}
}
Producers - passo 2
(ProducerModules)
@ProducerModule
public class MyProducerModule {
@Produces
public HeavyDep produceHeavyDep() {
// Sempre Singleton
return new HeavyDep();
}
}
Producers - passo 3 (ProductionComponent)
@ProductionComponent(
modules = { MyProducerModule.class,
ExecutorModule.class }
)
public interface ProducerComponent {
ListenableFuture<HeavyDep> heavyDep();
}
Producers - passo 4
ProducerComponent component = ...
Futures.addCallback(component.heavyDep(),
new FutureCallback() {
@Override
public void onSuccess(HeavyDep dep) {}
@Override
public void onFailure(Throwable t) {}
});
Producers - observações
Os Production Components podem
depender de Components
convencionais, e podem conter módulos
que fornecem dependências pela
anotação @Provides
Dagger 2
Testing Tricks
Trick #1 - Só APT
compile 'com.google.dagger:dagger:2.6.1'
androidTestApt 'com.google.dagger:dagger-compiler:2.6.1'
testApt 'com.google.dagger:dagger-compiler:2.6.1'
Trick #2 - Facilidade de Mock
Crie o módulo recebendo as dependências mockadas
no construtor. Assim, fica mais fácil controlar o objeto
dentro de um teste!
@Module
public class ConcreteTestModule {
private BluetoothMock btMock;
public ConcreteTestModule(BluetoothMock mock) {
this.btMock = mock;
}
@Provides
public Bluetooth provideBluetoothMock() {
return btMock;
}
}
@Before
public void setUp() {
Bluetooth bt = mock(Bluetooth.class);
MyComponent testComponent =
DaggerTestComponent.builder()
.concreteTestModule(new ConcreteTestModule(bt))
.build();
// RuntimeEnvironment.application
// ou
// InstrumentationRegistry.getTargetContext()
// .getApplicationContext()
app.setComponent(testComponent);
}
Mais Dagger 2
google.github.io/dagger
frogermcs.github.io
medium.com/android-dev-br
Slack #dagger
www.concretesolutions.com.br
Rio de Janeiro – Rua São José, 90 – cj. 2121
Centro – (21) 2240-2030
São Paulo - Av. Nações Unidas, 11.541
3º andar - Brooklin - (11) 4119-0449
Ajudamos empresas a criar
produtos digitais de sucesso
@_rafaeltoledo
www.rafaeltoledo.net
blog.concretesolutions.com.br
concretesolutions.com.br/carreira

Contenu connexe

Tendances

Android Studio: Primeiros Passos
Android Studio: Primeiros PassosAndroid Studio: Primeiros Passos
Android Studio: Primeiros PassosRomualdo Andre
 
Criando uma arquitetura para seus testes de API com RestAssured
Criando uma arquitetura para seus testes de API com RestAssuredCriando uma arquitetura para seus testes de API com RestAssured
Criando uma arquitetura para seus testes de API com RestAssuredElias Nogueira
 
UAI Test - Introdução Prática ao Jenkins
UAI Test - Introdução Prática ao JenkinsUAI Test - Introdução Prática ao Jenkins
UAI Test - Introdução Prática ao JenkinsStefan Teixeira
 
Android DevConference - Refactoring for RxJava
Android DevConference - Refactoring for RxJavaAndroid DevConference - Refactoring for RxJava
Android DevConference - Refactoring for RxJavaiMasters
 
Spring Boot - Uma app do 0 a Web em 30 minutos
Spring Boot - Uma app do 0 a Web em 30 minutosSpring Boot - Uma app do 0 a Web em 30 minutos
Spring Boot - Uma app do 0 a Web em 30 minutosphelypploch
 
WordCamp Floripa 2021 - Fernando Nilson - Análise de vulnerabilidade
WordCamp Floripa 2021 - Fernando Nilson - Análise de vulnerabilidadeWordCamp Floripa 2021 - Fernando Nilson - Análise de vulnerabilidade
WordCamp Floripa 2021 - Fernando Nilson - Análise de vulnerabilidadeWordCamp Floripa
 
Jenkins e a Integração Contínua
Jenkins e a Integração ContínuaJenkins e a Integração Contínua
Jenkins e a Integração ContínuaDenis Vieira
 
Como criar e executar testes paralelos web usando Selenium e containers
Como criar e executar testes paralelos web usando Selenium e containersComo criar e executar testes paralelos web usando Selenium e containers
Como criar e executar testes paralelos web usando Selenium e containersElias Nogueira
 
Dependency Injection com Kotlin - Thais Aquino
Dependency Injection com Kotlin - Thais AquinoDependency Injection com Kotlin - Thais Aquino
Dependency Injection com Kotlin - Thais AquinoiMasters
 
Java enterprise - testcontainers
Java enterprise - testcontainersJava enterprise - testcontainers
Java enterprise - testcontainersSandro Giacomozzi
 
Aulas Google Android
Aulas Google AndroidAulas Google Android
Aulas Google AndroidIury Teixeira
 
Leitor de Códigos no Android com Barcode Scanner API - ZXing
Leitor de Códigos no Android com Barcode Scanner API - ZXingLeitor de Códigos no Android com Barcode Scanner API - ZXing
Leitor de Códigos no Android com Barcode Scanner API - ZXingVinícius Thiengo
 
Apresentação maven
Apresentação mavenApresentação maven
Apresentação mavenAndré Justi
 
Como Reter Objetos Utilizando Android-State API
Como Reter Objetos Utilizando Android-State APIComo Reter Objetos Utilizando Android-State API
Como Reter Objetos Utilizando Android-State APIVinícius Thiengo
 

Tendances (20)

Maven
MavenMaven
Maven
 
Android Studio: Primeiros Passos
Android Studio: Primeiros PassosAndroid Studio: Primeiros Passos
Android Studio: Primeiros Passos
 
Criando uma arquitetura para seus testes de API com RestAssured
Criando uma arquitetura para seus testes de API com RestAssuredCriando uma arquitetura para seus testes de API com RestAssured
Criando uma arquitetura para seus testes de API com RestAssured
 
UAI Test - Introdução Prática ao Jenkins
UAI Test - Introdução Prática ao JenkinsUAI Test - Introdução Prática ao Jenkins
UAI Test - Introdução Prática ao Jenkins
 
Android DevConference - Refactoring for RxJava
Android DevConference - Refactoring for RxJavaAndroid DevConference - Refactoring for RxJava
Android DevConference - Refactoring for RxJava
 
Spring Boot - Uma app do 0 a Web em 30 minutos
Spring Boot - Uma app do 0 a Web em 30 minutosSpring Boot - Uma app do 0 a Web em 30 minutos
Spring Boot - Uma app do 0 a Web em 30 minutos
 
WordCamp Floripa 2021 - Fernando Nilson - Análise de vulnerabilidade
WordCamp Floripa 2021 - Fernando Nilson - Análise de vulnerabilidadeWordCamp Floripa 2021 - Fernando Nilson - Análise de vulnerabilidade
WordCamp Floripa 2021 - Fernando Nilson - Análise de vulnerabilidade
 
Jenkins e a Integração Contínua
Jenkins e a Integração ContínuaJenkins e a Integração Contínua
Jenkins e a Integração Contínua
 
Maven introdução Muito Rápida
Maven introdução Muito RápidaMaven introdução Muito Rápida
Maven introdução Muito Rápida
 
Precisamos falar sobre Gradle
Precisamos falar sobre GradlePrecisamos falar sobre Gradle
Precisamos falar sobre Gradle
 
Como criar e executar testes paralelos web usando Selenium e containers
Como criar e executar testes paralelos web usando Selenium e containersComo criar e executar testes paralelos web usando Selenium e containers
Como criar e executar testes paralelos web usando Selenium e containers
 
Dependency Injection com Kotlin - Thais Aquino
Dependency Injection com Kotlin - Thais AquinoDependency Injection com Kotlin - Thais Aquino
Dependency Injection com Kotlin - Thais Aquino
 
Java enterprise - testcontainers
Java enterprise - testcontainersJava enterprise - testcontainers
Java enterprise - testcontainers
 
Aulas Google Android
Aulas Google AndroidAulas Google Android
Aulas Google Android
 
Leitor de Códigos no Android com Barcode Scanner API - ZXing
Leitor de Códigos no Android com Barcode Scanner API - ZXingLeitor de Códigos no Android com Barcode Scanner API - ZXing
Leitor de Códigos no Android com Barcode Scanner API - ZXing
 
Maven - Aula 01
Maven - Aula 01Maven - Aula 01
Maven - Aula 01
 
Apresentação maven
Apresentação mavenApresentação maven
Apresentação maven
 
Introdução ao Android Studio
Introdução ao Android StudioIntrodução ao Android Studio
Introdução ao Android Studio
 
Como Reter Objetos Utilizando Android-State API
Como Reter Objetos Utilizando Android-State APIComo Reter Objetos Utilizando Android-State API
Como Reter Objetos Utilizando Android-State API
 
Android Aula 5
Android Aula 5Android Aula 5
Android Aula 5
 

En vedette

Retro vs Volley
Retro vs VolleyRetro vs Volley
Retro vs VolleyArtjoker
 
Infinum Android Talks #16 - Retrofit 2 by Kristijan Jurkovic
Infinum Android Talks #16 - Retrofit 2 by Kristijan JurkovicInfinum Android Talks #16 - Retrofit 2 by Kristijan Jurkovic
Infinum Android Talks #16 - Retrofit 2 by Kristijan JurkovicInfinum
 
Reactive programming on Android
Reactive programming on AndroidReactive programming on Android
Reactive programming on AndroidTomáš Kypta
 
Retrofit 2 - O que devemos saber
Retrofit 2 - O que devemos saberRetrofit 2 - O que devemos saber
Retrofit 2 - O que devemos saberBruno Vieira
 
Reactive programming with RxJava
Reactive programming with RxJavaReactive programming with RxJava
Reactive programming with RxJavaJobaer Chowdhury
 
Practical RxJava for Android
Practical RxJava for AndroidPractical RxJava for Android
Practical RxJava for AndroidTomáš Kypta
 
RxJava - introduction & design
RxJava - introduction & designRxJava - introduction & design
RxJava - introduction & designallegro.tech
 
Reactive programming on Android
Reactive programming on AndroidReactive programming on Android
Reactive programming on AndroidTomáš Kypta
 
Reactive Programming on Android - RxAndroid - RxJava
Reactive Programming on Android - RxAndroid - RxJavaReactive Programming on Android - RxAndroid - RxJava
Reactive Programming on Android - RxAndroid - RxJavaAli Muzaffar
 
Java 8 Stream API and RxJava Comparison
Java 8 Stream API and RxJava ComparisonJava 8 Stream API and RxJava Comparison
Java 8 Stream API and RxJava ComparisonJosé Paumard
 
FrenchWeb 500, le classement des entreprises de la tech française
FrenchWeb 500, le classement des entreprises de la tech françaiseFrenchWeb 500, le classement des entreprises de la tech française
FrenchWeb 500, le classement des entreprises de la tech françaiseFrenchWeb.fr
 

En vedette (11)

Retro vs Volley
Retro vs VolleyRetro vs Volley
Retro vs Volley
 
Infinum Android Talks #16 - Retrofit 2 by Kristijan Jurkovic
Infinum Android Talks #16 - Retrofit 2 by Kristijan JurkovicInfinum Android Talks #16 - Retrofit 2 by Kristijan Jurkovic
Infinum Android Talks #16 - Retrofit 2 by Kristijan Jurkovic
 
Reactive programming on Android
Reactive programming on AndroidReactive programming on Android
Reactive programming on Android
 
Retrofit 2 - O que devemos saber
Retrofit 2 - O que devemos saberRetrofit 2 - O que devemos saber
Retrofit 2 - O que devemos saber
 
Reactive programming with RxJava
Reactive programming with RxJavaReactive programming with RxJava
Reactive programming with RxJava
 
Practical RxJava for Android
Practical RxJava for AndroidPractical RxJava for Android
Practical RxJava for Android
 
RxJava - introduction & design
RxJava - introduction & designRxJava - introduction & design
RxJava - introduction & design
 
Reactive programming on Android
Reactive programming on AndroidReactive programming on Android
Reactive programming on Android
 
Reactive Programming on Android - RxAndroid - RxJava
Reactive Programming on Android - RxAndroid - RxJavaReactive Programming on Android - RxAndroid - RxJava
Reactive Programming on Android - RxAndroid - RxJava
 
Java 8 Stream API and RxJava Comparison
Java 8 Stream API and RxJava ComparisonJava 8 Stream API and RxJava Comparison
Java 8 Stream API and RxJava Comparison
 
FrenchWeb 500, le classement des entreprises de la tech française
FrenchWeb 500, le classement des entreprises de la tech françaiseFrenchWeb 500, le classement des entreprises de la tech française
FrenchWeb 500, le classement des entreprises de la tech française
 

Similaire à Android DevConference - Dagger 2: uso avançado em projetos Android

Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javJulio Viegas
 
T10_LM3: Subalgoritmos/funções (2013-2014)
T10_LM3: Subalgoritmos/funções (2013-2014)T10_LM3: Subalgoritmos/funções (2013-2014)
T10_LM3: Subalgoritmos/funções (2013-2014)Carlos Santos
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Elton Minetto
 
Spring & Struts
Spring & StrutsSpring & Struts
Spring & Strutseduan
 
(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - SubalgoritmosCarlos Santos
 
Introducao ao Spring Web MVC
Introducao ao Spring Web MVCIntroducao ao Spring Web MVC
Introducao ao Spring Web MVCEder Magalhães
 
Orientação a Objetos - Da Teoria a Pratica
Orientação a Objetos - Da Teoria a PraticaOrientação a Objetos - Da Teoria a Pratica
Orientação a Objetos - Da Teoria a Praticaelliando dias
 
Orientacao A Objetos Da Teoria A Pratica Em Java
Orientacao A Objetos   Da Teoria A Pratica Em JavaOrientacao A Objetos   Da Teoria A Pratica Em Java
Orientacao A Objetos Da Teoria A Pratica Em Javaelliando dias
 
JavaEE 7, na era do cloud computing
JavaEE 7, na era do cloud computingJavaEE 7, na era do cloud computing
JavaEE 7, na era do cloud computingEder Magalhães
 
Como escolher o Framework Java para web?
Como escolher o Framework Java para web?Como escolher o Framework Java para web?
Como escolher o Framework Java para web?Anderson Araújo
 
Workshop React Hooks
Workshop React HooksWorkshop React Hooks
Workshop React HooksDan Vitoriano
 
TDC2018SP | Trilha .Net - Novidades do ASP.NET Core 2.1
TDC2018SP | Trilha .Net - Novidades do ASP.NET Core 2.1TDC2018SP | Trilha .Net - Novidades do ASP.NET Core 2.1
TDC2018SP | Trilha .Net - Novidades do ASP.NET Core 2.1tdc-globalcode
 
Novidades do ASP.NET Core 2.1 - TDC 2018 - São Paulo
Novidades do ASP.NET Core 2.1 - TDC 2018 - São PauloNovidades do ASP.NET Core 2.1 - TDC 2018 - São Paulo
Novidades do ASP.NET Core 2.1 - TDC 2018 - São PauloRenato Groff
 

Similaire à Android DevConference - Dagger 2: uso avançado em projetos Android (20)

VRaptor4
VRaptor4VRaptor4
VRaptor4
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_jav
 
Git, GitHub e OO
Git, GitHub e OOGit, GitHub e OO
Git, GitHub e OO
 
Java1
Java1Java1
Java1
 
T10_LM3: Subalgoritmos/funções (2013-2014)
T10_LM3: Subalgoritmos/funções (2013-2014)T10_LM3: Subalgoritmos/funções (2013-2014)
T10_LM3: Subalgoritmos/funções (2013-2014)
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2
 
Java 14 Javadoc
Java 14 JavadocJava 14 Javadoc
Java 14 Javadoc
 
Gwt-Guice_TDC2009
Gwt-Guice_TDC2009Gwt-Guice_TDC2009
Gwt-Guice_TDC2009
 
Spring & Struts
Spring & StrutsSpring & Struts
Spring & Struts
 
(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos
 
Introducao ao Spring Web MVC
Introducao ao Spring Web MVCIntroducao ao Spring Web MVC
Introducao ao Spring Web MVC
 
Kotlin first
Kotlin firstKotlin first
Kotlin first
 
Orientação a Objetos - Da Teoria a Pratica
Orientação a Objetos - Da Teoria a PraticaOrientação a Objetos - Da Teoria a Pratica
Orientação a Objetos - Da Teoria a Pratica
 
Orientacao A Objetos Da Teoria A Pratica Em Java
Orientacao A Objetos   Da Teoria A Pratica Em JavaOrientacao A Objetos   Da Teoria A Pratica Em Java
Orientacao A Objetos Da Teoria A Pratica Em Java
 
JavaEE 7, na era do cloud computing
JavaEE 7, na era do cloud computingJavaEE 7, na era do cloud computing
JavaEE 7, na era do cloud computing
 
Como escolher o Framework Java para web?
Como escolher o Framework Java para web?Como escolher o Framework Java para web?
Como escolher o Framework Java para web?
 
Workshop React Hooks
Workshop React HooksWorkshop React Hooks
Workshop React Hooks
 
TDC2018SP | Trilha .Net - Novidades do ASP.NET Core 2.1
TDC2018SP | Trilha .Net - Novidades do ASP.NET Core 2.1TDC2018SP | Trilha .Net - Novidades do ASP.NET Core 2.1
TDC2018SP | Trilha .Net - Novidades do ASP.NET Core 2.1
 
Novidades do ASP.NET Core 2.1 - TDC 2018 - São Paulo
Novidades do ASP.NET Core 2.1 - TDC 2018 - São PauloNovidades do ASP.NET Core 2.1 - TDC 2018 - São Paulo
Novidades do ASP.NET Core 2.1 - TDC 2018 - São Paulo
 
E2e test protractor
E2e test protractorE2e test protractor
E2e test protractor
 

Plus de iMasters

O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani MonteiroO que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani MonteiroiMasters
 
Postgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio TellesPostgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio TellesiMasters
 
Por que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen MoraesPor que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen MoraesiMasters
 
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...iMasters
 
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalvesORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalvesiMasters
 
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...iMasters
 
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra MartinsArquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra MartinsiMasters
 
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...iMasters
 
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana ChahoudDesenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana ChahoudiMasters
 
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
 Use MDD e faça as máquinas trabalharem para você - Andreza Leite Use MDD e faça as máquinas trabalharem para você - Andreza Leite
Use MDD e faça as máquinas trabalharem para você - Andreza LeiteiMasters
 
Entendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita BernardesEntendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita BernardesiMasters
 
Backend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana ArnosBackend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana ArnosiMasters
 
Dicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeDicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeiMasters
 
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle MonteiroiMasters
 
Quem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio MaujorQuem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio MaujoriMasters
 
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da SilvaService Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da SilvaiMasters
 
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto PascuttiErros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto PascuttiiMasters
 
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...iMasters
 
Construindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina KarklisConstruindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina KarklisiMasters
 
Monitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe RegalgoMonitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe RegalgoiMasters
 

Plus de iMasters (20)

O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani MonteiroO que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
 
Postgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio TellesPostgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio Telles
 
Por que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen MoraesPor que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen Moraes
 
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
 
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalvesORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
 
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
 
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra MartinsArquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
 
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
 
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana ChahoudDesenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
 
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
 Use MDD e faça as máquinas trabalharem para você - Andreza Leite Use MDD e faça as máquinas trabalharem para você - Andreza Leite
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
 
Entendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita BernardesEntendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita Bernardes
 
Backend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana ArnosBackend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana Arnos
 
Dicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeDicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato Groffe
 
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
 
Quem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio MaujorQuem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio Maujor
 
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da SilvaService Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
 
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto PascuttiErros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
 
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
 
Construindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina KarklisConstruindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina Karklis
 
Monitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe RegalgoMonitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe Regalgo
 

Android DevConference - Dagger 2: uso avançado em projetos Android

  • 1. Dagger 2 uso avançado em projetos Android
  • 2. DI - Dependency Injection Não crie, peça Dependa de abstrações, não dependa de classes concretas
  • 5. AVISO! Cuidado com a quantidade de interfaces!
  • 7. Qualifiers - por quê? Diferenciação de dependências de mesmo tipo / classe
  • 9. @Module public class QualifiedModule { @Provides @ApiUrl public String provideApiUrl() { return "https://api.stackexchange.com/2.2/"; } @Provides public String provideUnqualified() { return "Android!"; } }
  • 10. public class InjectedClass { @Inject String value; @Inject @ApiUrl String url; ...
  • 11. @Module public class AnotherModule { @Provides public MyClass provideClass(String value, @ApiUrl String url) { return new MyClass(value, url); } ...
  • 12. Qualifiers - extras @Qualifier @Retention(RetentionPolicy.RUNTIME) public @interface Named { String value() default ""; }
  • 13. @Module public class QualifiedModule { @Provides @Named("One") public String provideV1() { return "one!"; } @Provides @Named("Two") public String provideV2() { return "two!"; } }
  • 14. public class InjectedClass { @Inject @Named("One") String value1; // one! @Inject @Named("Two") String value2; // two! ...
  • 15. Qualifiers - extras @Qualifier @Retention(RetentionPolicy.RUNTIME) public @interface ComplexQualifier { String value() default ""; int ordinal() default 1; }
  • 17. Custom Scopes - por quê? Ciclo de vida de um objeto dentro de um escopo É uma espécie de “Singleton local”
  • 18. Custom Scopes - como? @Scope @Retention(RetentionPolicy.RUNTIME) public @interface ActivityScope { }
  • 19. @Module public class ScopedModule { @Provides @ActivityScope public MyObject provideDependency() { // Singleton on this scope } @Provides public MyOtherObject provideOtherDependency() { // Each request, a new object } }
  • 20. Custom Scopes - como? @ActivityScope @SubComponent(modules = ScopedModule.class) public interface ActivityComponent { ... }
  • 21. Custom Scopes - como? @Singleton @Component(...) public interface MainComponent { ActivityComponent plus(); }
  • 22. Custom Scopes - como? @Singleton @Component(...) public interface MainComponent { ActivityComponent plus(); // Shared dependency Application getApplication(); }
  • 23. Custom Scopes - como? @Singleton @Component(...) public interface MainComponent { // If module has no default constructor ActivityComponent plus(CustomModule m); }
  • 24. Custom Scopes - como? ActivityComponent activityComponent = mainComponent.plus(); // ou ActivityComponent activityComponent = mainComponent.plus(new MyModule(ctx));
  • 25. Custom Scopes - importante É importante sempre gerenciar o ciclo de vida do componente de acordo com o escopo desejado para evitar leaks Explicitamente: activityComponent = null;
  • 26. Pro Tip: Escopo @Reusable
  • 27. Escopo @Reusable Otimização para dependências que podem ser reutilizadas mas não precisam necessariamente ser a mesma instância. Muito útil para Utils e Helpers Disponível a partir da versão 2.3
  • 29. Multibindings - por quê? Dependências que só fazem sentido juntas São entregues juntas dentro de uma collection - Map ou Set
  • 30. @Module public class MultibindingsSetModule { @Provides @IntoSet public String provideFirstValue() { return "One!"; } @Provides @IntoSet public String provideSecondValue() { return "Two!"; } }
  • 31. public class InjectedClass { @Inject Set<String> values; // One!, Two! ...
  • 32. @Module public class MultibindingsMapModule { @Provides @IntoMap @StringKey("key1") public String provideFirstValue() { return "One!"; } @Provides @IntoMap @StringKey("key2") public String provideSecondValue() { return "Two!"; }
  • 33. public class InjectedClass { @Inject Map<String, String> values; // key1 => One! // key2 =: Two! ...
  • 34. Multibindings - Maps As chaves podem ser: IntKey LongKey StringKey ClassKey
  • 35. Multibindings - Dica Caso a coleção possa, por algum motivo, ficar vazia, precisamos de um módulo abstrato declarando a coleção. @Module public abstract class MyModule { @Multibinds public abstract Set<String> possiblyEmpty(); }
  • 37. Binds - por quê? Servem para ligar interfaces a implementações dentro de um módulo abstrato É um excelente aliado na criação de módulos de teste e na substituição de objetos reais por mocks
  • 38. @Module public abstract class BindModule { @Binds abstract Bluetooth provideBluetooth(BluetoothImpl impl); ... } @Module public class ConcreteModule { @Provides BluetoothImpl provideBluetoothImpl() { return new BluetoothImpl(); } }
  • 39. @Module public abstract class BindTestModule { @Binds abstract Bluetooth provideBluetooth(BluetoothMock mock); ... } @Module public class ConcreteTestModule { @Provides BluetoothMock provideBluetoothMock() { return new BluetoothMock(); } }
  • 41. Producers - por quê? São praticamente uma biblioteca à parte - de fato, são uma dependência à parte :) É uma API para a injeção de dependência de forma assíncrona, ideal para dependências muito pesadas ou de inicialização lenta.
  • 42. Producers - avisos Não segue o padrão da JSR-330 - não usa anotações @Inject, por exemplo Adiciona o Guava ao classpath do projeto, o que pode engordar o APK e contribuir para aumento do número de métodos… #MultidexDanger
  • 43. Producers - passo 1 (Executor) @Module public class ExecutorModule { @Provides @Production public Executor provideExecutor() { return Executors.newCachedThreadPool(); } }
  • 44. Producers - passo 2 (ProducerModules) @ProducerModule public class MyProducerModule { @Produces public HeavyDep produceHeavyDep() { // Sempre Singleton return new HeavyDep(); } }
  • 45. Producers - passo 3 (ProductionComponent) @ProductionComponent( modules = { MyProducerModule.class, ExecutorModule.class } ) public interface ProducerComponent { ListenableFuture<HeavyDep> heavyDep(); }
  • 46. Producers - passo 4 ProducerComponent component = ... Futures.addCallback(component.heavyDep(), new FutureCallback() { @Override public void onSuccess(HeavyDep dep) {} @Override public void onFailure(Throwable t) {} });
  • 47. Producers - observações Os Production Components podem depender de Components convencionais, e podem conter módulos que fornecem dependências pela anotação @Provides
  • 49. Trick #1 - Só APT compile 'com.google.dagger:dagger:2.6.1' androidTestApt 'com.google.dagger:dagger-compiler:2.6.1' testApt 'com.google.dagger:dagger-compiler:2.6.1'
  • 50. Trick #2 - Facilidade de Mock Crie o módulo recebendo as dependências mockadas no construtor. Assim, fica mais fácil controlar o objeto dentro de um teste!
  • 51. @Module public class ConcreteTestModule { private BluetoothMock btMock; public ConcreteTestModule(BluetoothMock mock) { this.btMock = mock; } @Provides public Bluetooth provideBluetoothMock() { return btMock; } }
  • 52. @Before public void setUp() { Bluetooth bt = mock(Bluetooth.class); MyComponent testComponent = DaggerTestComponent.builder() .concreteTestModule(new ConcreteTestModule(bt)) .build(); // RuntimeEnvironment.application // ou // InstrumentationRegistry.getTargetContext() // .getApplicationContext() app.setComponent(testComponent); }
  • 54. www.concretesolutions.com.br Rio de Janeiro – Rua São José, 90 – cj. 2121 Centro – (21) 2240-2030 São Paulo - Av. Nações Unidas, 11.541 3º andar - Brooklin - (11) 4119-0449 Ajudamos empresas a criar produtos digitais de sucesso @_rafaeltoledo www.rafaeltoledo.net blog.concretesolutions.com.br concretesolutions.com.br/carreira