SlideShare ist ein Scribd-Unternehmen logo
1 von 61
Downloaden Sie, um offline zu lesen
Android architecture for
the everyday developer
Adrián Catalán
@ykro
adrian@bitandik.com
RAISE YOUR HAND POLLS
How Andy & I used to do things
or common workflow of an Android app
○ Activities & fragments
■ UI tasks :)
■ UI logic (¿?)
■ Database queries (¡!)
WAIT, BUT, WHY?
https://www.flickr.com/photos/31997662@N00/10686813595
MAINTAINABILITY
https://www.flickr.com/photos/57974696@N00/7993485910/
SCALABILITY
https://www.flickr.com/photos/46425925@N00/438253751/
TESTBILITY
https://www.flickr.com/photos/27703797@N06/13952482985
LONG-TERM RELIABILITY
https://www.flickr.com/photos/92694860@N00/5751130432/
DECOUPLE
https://www.flickr.com/photos/14113765@N00/2622333378
SOFTWARE IS ABOUT PEOPLE
https://www.flickr.com/photos/53016579@N00/14579648177/
Controller
Model View
User actionManipulates
Notify Update
MVP
https://www.flickr.com/photos/53326337@N00/3108535629/
ModelPresenterView
User
Notify Request data
DeliversUpdate UI
Model
Presenter
View Shows an interface (passive).
Obtains data from the model and
tells the View how to behave
through a notification
Handles business logic
View
public interface LoginView {
void enableInputs();
void disableInputs();
void showProgress();
void hideProgress();
void successLogin();
void failedLogin(String error);
}
Implementation
@Override
public void enableInputs() {
setInputs(true);
}
@Override
public void disableInputs() {
setInputs(false);
}
private void setInputs(boolean enabled){
inputEmail.setEnabled(enabled);
inputPassword.setEnabled(enabled);
buttonSubmit.setEnabled(enabled);
}
@Override
public void showProgress() {
progressBar.setVisibility(
View.VISIBLE);
}
Implementation
@Override
public void failedLogin(
String error) {
if (error != null &&
!error.isEmpty()) {
inputEmail.setError(error);
}
}
@Override
public void hideProgress() {
progressBar.setVisibility(
View.GONE);
}
@Override
public void successLogin() {
startActivity(
new Intent(this,
ContentActivity.class
));
}
Activity
public class LoginActivity extends AppCompatActivity implements LoginView {
LoginPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
presenter = new LoginPresenterImpl(this);
}
@Override
protected void onDestroy() {
presenter.onDestroy();
super.onDestroy();
}
}
Activity
public class LoginActivity extends AppCompatActivity implements LoginView {
...
@OnClick(R.id.email_sign_in_button)
public void login(){
presenter.login(inputEmail.getText().toString(),
inputPassword.getText().toString());
}
}
Presenter
public interface LoginPresenter {
void onDestroy();
void login(String email, String password);
}
http://fullhdpictures.com/pug-hq-photos.html/smiling-pug-wallpaper
Presenter
public interface LoginPresenter {
void onDestroy();
void login(String email, String password);
}
Implementation
public class LoginPresenterImpl implements LoginPresenter {
LoginView view;
LoginModel model;
public LoginPresenterImpl(LoginView view) {
this.view = view;
this.model = new LoginModelImpl(this);
}
@Override
public void onDestroy() {
view = null;
}
}
Implementation
public class LoginPresenterImpl implements LoginPresenter, LoginTaskListener {
...
@Override
public void login(String email, String password) {
if (this.view != null) {
view.disableInputs();
view.showProgress();
model.login(email, password);
}
}
Model-Presenter Interface
public interface LoginTaskListener {
void loginSuccess();
void loginError(String error);
}
Presenter
@Override
public void loginSuccess(){
if (this.view != null) {
view.enableInputs();
view.hideProgress();
view.successLogin();
}
}
@Override
public void loginError(String error) {
if (this.view != null) {
view.enableInputs();
view.hideProgress();
view.failedLogin(error);
}
}
Model
public interface LoginModel {
void login(String user, String password);
}
Implementation
public class LoginModelImpl implements LoginModel {
LoginTaskListener listener;
public LoginModelImpl(LoginTaskListener listener) {
this.listener = listener;
}
@Override
public void login(String user, String password) {
...
}
}
EVENT BUS
https://www.flickr.com/photos/92622665@N08/9193171612
Using the library
public class LoginEvent {
public final static int ERROR = 0;
public final static int SUCCESS = 1;
int type;
String error;
...
}
Presenter
@Override
public void onCreate() {
eventBus.register(this);
}
@Override
public void onDestroy() {
view = null;
eventBus.unregister(this);
}
Presenter
@Subscribe
public void onEventMainThread(LoginEvent event){
if (this.view != null) {
view.enableInputs();
view.hideProgress();
if (event.getType() == LoginEvent.SUCCESS) {
view.successLogin();
} else if (event.getType() == LoginEvent.ERROR){
view.failedLogin(event.getErrror());
}
}
}
Model
LoginEvent event = new LoginEvent();
if (...) {
event.setType(LoginEvent.SUCCESS);
} else {
event.setType(LoginEvent.ERROR);
event.setError("failed");
}
eventBus.post(event);
CLEAN
https://www.flickr.com/photos/24628543@N00/5523923392/
View
Presenter
Presenter
Interactor
Interactor
Interactor
Interactor
Repository
Repository
Data Source
Data Source
Data Source
Data Source
Interactor
Database, APIs, etc
Connects UI with data, regardless
of source and rendering.
Repository
Connects with data sources and
gets the data.
Interactor
public interface NumbersInteractor {
void getNumbers();
}
public interface WordsInteractor {
void getWords();
}
Numbers interactor
public class NumbersInteractorImpl implements NumbersInteractor {
ContentRepository contentRepository;
public NumbersInteractorImpl() {
contentRepository = ContentRepositoryImpl.getInstance();
}
@Override
public void getNumbers() {
contentRepository.getNumbers();
}
}
Words interactor
public class WordsInteractorImpl implements WordsInteractor {
ContentRepository contentRepository;
public WordsInteractorImpl() {
contentRepository = ContentRepositoryImpl.getInstance();
}
@Override
public void getWords() {
contentRepository.getWords();
}
}
Presenter
@Override
public void getWords() {
WordsInteractor interactor = new WordsInteractorImpl();
interactor.getWords();
}
@Override
public void getNumbers() {
NumbersInteractor interactor = new NumbersInteractorImpl();
interactor.getNumbers();
}
Repository
public interface ContentRepository {
void getNumbers();
void getWords();
}
Implementation
public class ContentRepositoryImpl implements ContentRepository {
…
@Override
public void getNumbers() {
String[] data = {"1", "2", "3"};
ContentEvent event = new ContentEvent();
event.setData(Arrays.asList(data));
eventBus.post(event);
}
}
Implementation
public class ContentRepositoryImpl implements ContentRepository {
…
@Override
public void getWords() {
String[] data = {"a", "b", "c"};
ContentEvent event = new ContentEvent();
event.setData(Arrays.asList(data));
eventBus.post(event);
}
}
Useful links
https://blog.8thlight.com/uncle-bob/2012/08/13/the-
clean-architecture.html
https://github.com/googlesamples/android-architecture
Useful links
https://github.com/Karumi/Rosie
https://github.com/ykro/simplemvp
adrian@bitandik.com
Android architecture for
the everyday developer
Adrián Catalán
@ykro

Weitere ähnliche Inhalte

Ähnlich wie MCE^3 - Adrian Catalan - Android Architecture for the Everyday Developer

mobile in the cloud with diamonds. improved.
mobile in the cloud with diamonds. improved.mobile in the cloud with diamonds. improved.
mobile in the cloud with diamonds. improved.Oleg Shanyuk
 
Migrating to Angular 2
Migrating to Angular 2Migrating to Angular 2
Migrating to Angular 2FITC
 
Spring AOP Introduction
Spring AOP IntroductionSpring AOP Introduction
Spring AOP Introductionb0ris_1
 
The 2016 Android Developer Toolbox [NANTES]
The 2016 Android Developer Toolbox [NANTES]The 2016 Android Developer Toolbox [NANTES]
The 2016 Android Developer Toolbox [NANTES]Nilhcem
 
160714 roppongi aar3_how_to_implement_activity
160714 roppongi aar3_how_to_implement_activity160714 roppongi aar3_how_to_implement_activity
160714 roppongi aar3_how_to_implement_activityTsuyoshi Yoshioka
 
A gently introduction to AngularJS
A gently introduction to AngularJSA gently introduction to AngularJS
A gently introduction to AngularJSGregor Woiwode
 
Встреча Google Post IO ( Владимир Иванов, Катерина Заворотченко и Сергей Комлач)
Встреча Google Post IO ( Владимир Иванов, Катерина Заворотченко и Сергей Комлач)Встреча Google Post IO ( Владимир Иванов, Катерина Заворотченко и Сергей Комлач)
Встреча Google Post IO ( Владимир Иванов, Катерина Заворотченко и Сергей Комлач)Alina Vilk
 
My way to clean android (EN) - Android day salamanca edition
My way to clean android (EN) - Android day salamanca editionMy way to clean android (EN) - Android day salamanca edition
My way to clean android (EN) - Android day salamanca editionChristian Panadero
 
Android architecture component - FbCircleDev Yogyakarta Indonesia
Android architecture component - FbCircleDev Yogyakarta IndonesiaAndroid architecture component - FbCircleDev Yogyakarta Indonesia
Android architecture component - FbCircleDev Yogyakarta IndonesiaPratama Nur Wijaya
 
Arduino Project - Ciclo de palestras CEET Vasco Coutinho
Arduino Project - Ciclo de palestras CEET Vasco CoutinhoArduino Project - Ciclo de palestras CEET Vasco Coutinho
Arduino Project - Ciclo de palestras CEET Vasco CoutinhoAlmir Mendes
 
Blog it, Tag it, Poke it!
Blog it, Tag it, Poke it!Blog it, Tag it, Poke it!
Blog it, Tag it, Poke it!Matt Lingard
 
Projeto Arduino - Hardware para fazer coisas legais - FOCAI
Projeto Arduino - Hardware para fazer coisas legais - FOCAIProjeto Arduino - Hardware para fazer coisas legais - FOCAI
Projeto Arduino - Hardware para fazer coisas legais - FOCAIAlmir Mendes
 
Google Plus SignIn : l'Authentification Google
Google Plus SignIn : l'Authentification GoogleGoogle Plus SignIn : l'Authentification Google
Google Plus SignIn : l'Authentification GoogleMathias Seguy
 
My way to clean android - Android day salamanca edition
My way to clean android - Android day salamanca editionMy way to clean android - Android day salamanca edition
My way to clean android - Android day salamanca editionChristian Panadero
 
Async task, threads, pools, and executors oh my!
Async task, threads, pools, and executors oh my!Async task, threads, pools, and executors oh my!
Async task, threads, pools, and executors oh my!Stacy Devino
 

Ähnlich wie MCE^3 - Adrian Catalan - Android Architecture for the Everyday Developer (20)

mobile in the cloud with diamonds. improved.
mobile in the cloud with diamonds. improved.mobile in the cloud with diamonds. improved.
mobile in the cloud with diamonds. improved.
 
Migrating to Angular 2
Migrating to Angular 2Migrating to Angular 2
Migrating to Angular 2
 
Spring AOP Introduction
Spring AOP IntroductionSpring AOP Introduction
Spring AOP Introduction
 
The 2016 Android Developer Toolbox [NANTES]
The 2016 Android Developer Toolbox [NANTES]The 2016 Android Developer Toolbox [NANTES]
The 2016 Android Developer Toolbox [NANTES]
 
160714 roppongi aar3_how_to_implement_activity
160714 roppongi aar3_how_to_implement_activity160714 roppongi aar3_how_to_implement_activity
160714 roppongi aar3_how_to_implement_activity
 
A gently introduction to AngularJS
A gently introduction to AngularJSA gently introduction to AngularJS
A gently introduction to AngularJS
 
Встреча Google Post IO ( Владимир Иванов, Катерина Заворотченко и Сергей Комлач)
Встреча Google Post IO ( Владимир Иванов, Катерина Заворотченко и Сергей Комлач)Встреча Google Post IO ( Владимир Иванов, Катерина Заворотченко и Сергей Комлач)
Встреча Google Post IO ( Владимир Иванов, Катерина Заворотченко и Сергей Комлач)
 
Android best practices
Android best practicesAndroid best practices
Android best practices
 
Advanced android app development
Advanced android app developmentAdvanced android app development
Advanced android app development
 
My way to clean android (EN) - Android day salamanca edition
My way to clean android (EN) - Android day salamanca editionMy way to clean android (EN) - Android day salamanca edition
My way to clean android (EN) - Android day salamanca edition
 
Android architecture component - FbCircleDev Yogyakarta Indonesia
Android architecture component - FbCircleDev Yogyakarta IndonesiaAndroid architecture component - FbCircleDev Yogyakarta Indonesia
Android architecture component - FbCircleDev Yogyakarta Indonesia
 
Arduino Project - Ciclo de palestras CEET Vasco Coutinho
Arduino Project - Ciclo de palestras CEET Vasco CoutinhoArduino Project - Ciclo de palestras CEET Vasco Coutinho
Arduino Project - Ciclo de palestras CEET Vasco Coutinho
 
Blog it, Tag it, Poke it!
Blog it, Tag it, Poke it!Blog it, Tag it, Poke it!
Blog it, Tag it, Poke it!
 
Projeto Arduino - Hardware para fazer coisas legais - FOCAI
Projeto Arduino - Hardware para fazer coisas legais - FOCAIProjeto Arduino - Hardware para fazer coisas legais - FOCAI
Projeto Arduino - Hardware para fazer coisas legais - FOCAI
 
Google Plus SignIn : l'Authentification Google
Google Plus SignIn : l'Authentification GoogleGoogle Plus SignIn : l'Authentification Google
Google Plus SignIn : l'Authentification Google
 
Boost your angular app with web workers
Boost your angular app with web workersBoost your angular app with web workers
Boost your angular app with web workers
 
Y U NO CRAFTSMAN
Y U NO CRAFTSMANY U NO CRAFTSMAN
Y U NO CRAFTSMAN
 
My way to clean android - Android day salamanca edition
My way to clean android - Android day salamanca editionMy way to clean android - Android day salamanca edition
My way to clean android - Android day salamanca edition
 
QXCameraKit
QXCameraKitQXCameraKit
QXCameraKit
 
Async task, threads, pools, and executors oh my!
Async task, threads, pools, and executors oh my!Async task, threads, pools, and executors oh my!
Async task, threads, pools, and executors oh my!
 

Kürzlich hochgeladen

Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDropbox
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024The Digital Insurer
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024The Digital Insurer
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...apidays
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...apidays
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWERMadyBayot
 
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu SubbuApidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbuapidays
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsNanddeep Nachan
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native ApplicationsWSO2
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Zilliz
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 

Kürzlich hochgeladen (20)

Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu SubbuApidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 

MCE^3 - Adrian Catalan - Android Architecture for the Everyday Developer