SlideShare une entreprise Scribd logo
1  sur  135
@android2ee
by(Mathias Seguy== Android2EE){
French AndroidTrainer}
2
And so ?
2
Avec un objectif utilisateur fort
Dans un contexte de pénurie et un monde complexe
De grosses responsabilités
Des bonnes pratiques
Des habitudes
Des Design Patterns
Et une p**n d'archi générique
Je m'en sors
comment, moi?
l'objet Application
Les services métiers
4
Quand mon application est en
foreground, je veux toute la
puissance dont j'ai besoin !
Objectif
5
Quand mon application part en background,
je veux restituer le plus de ressources possible au système
(pour que les autres puissent l'utiliser).
Fuck I am
going in
background
Take that
services !
Objectif
6
Et comme je ne veux pas que mes utilisateurs subissent ça
Objectif
Et comme je ne veux pas que mes utilisateurs subissent ça
7
Ma philosophie est le LazyLoading
Objectif
8
Tout se joue
ArchiDroid
ICI
Aparté
10
L'Objet Application
Application
11
Démarre avant n'importe laquelle de vos classes
L'Objet Application
Conserve l'état global de l'application
Se termine après n'importe laquelle de vos classes
Est le Contexte de votre application
Application
Application
12
L'Objet Application
Vous devez vous l'approprier
public class DesignApplication extends Application {
}
<manifest package=
<application
...
android:name=".DesignApplication">
Application
13
L'Objet Application
Et le retrouver où que vous soyez: Design Pattern du Singleton
public class DesignApplication extends Application {
private static DesignApplication instance;
public static DesignApplication getInstance() {
return instance;}
public void onCreate() {
super.onCreate();
instance = this;…}
Application
14
L'Objet Application
Il peut être appelé de n'importe où
(de n'importe quel Thread).
Toutes ses méthodes publiques
doivent être synchronized.
15
setUser(…)
onStop
StartActivity
LoginActivty MainActivity
Application
getUser(…)
onStart
MainActivity
Application
getUser(…)
NullPointerException
1
2
3
4
5
6
7
8
L'Objet Application
L'exemple typique : l'utilisateur
16
Application
User user=null;
public void getUser() {
if(user==null) {
//Do what you need to do
//1)startActivity(LoginActivtyIntent);
//ou 2)retireve it from a SharedPreference||DataBase||File...
}
return user;
}
La classe Application est responsable de l'instanciation
des champs qu'elle persiste
L'Objet Application
17
Les Services
Services
AndroidServices
SingletonServices
Les Services
"Service (la classe Android):
Service is how an application indicates to the operating system
that it needs to perform a longer-running operation outside of the
normal Activity UI flow.
It may be self-running (through Context.startService()), or running
on behalf of of another process (through Context.bindService()).
If you do not need either of these behaviors, you should not
use a Service."
Service Android == Service Système
Les Services
La couche Service (architecture n-tier):
Elle correspond à la partie fonctionnelle de l'application, celle qui
implémente la « logique », et qui décrit les opérations que
l'application opère sur les données.
Les différentes règles de gestion et de contrôle du système sont
mises en œuvre dans cette couche.
Les Services
Les services Android sont-ils des services métiers?
Les services métiers sont-ils des services Android ?
Don't fuck around
with the system !
Les Services
Doit être considéré comme une
Activity sans IHM...
21
Services
AndroidServices
SingletonServices
Assurer l'unique instance (best to
do that using a ServiceManager
instead of static)
S'exécute dans le Thread UI
Est fait pour des tâches longues
Quand actif est conservé dans le
LRUCache as long as possible....
Plus gros qu'un simple pojo
Est légère (simple pojo)
Ainsi sont les Services métiers côté
serveur
On peut/doit aussi maîtriser leur
cycle de vie
??
Les Services
Services
AndroidServices
SingletonServices
??
Besoin d'être lancé par le système?
Besoin de faire du cache de données?
Les Services
Services
AndroidServices
SingletonServices
??
Besoin de continuer même sans Activité visible (Music Player)?
Pas de besoin particulier
Fin de l'aparté
Les instancier à la demande
25
Il faut qu'on arrive avec nos services métiers à:
ArchiDroid
Ne les instancier QU'une seule fois
Mettre en place l'asynchronicité
Ne pas suivre le cycle de vie des activités
mais le cycle de vie de l'application
Les laisser terminer leur traitement
26
Instanciation à la demande
private void launchServiceAsync() {
// load your service...
ServiceManager.instance.getHumanService(new OnServiceCallBack() {
public void onServiceCallBack(MService service) {
// so just call the method you want of your service
((HumanService) service).getHuman("toto");
}});}
the callBack pattern
View Presenter
HumanService
LazyLoading
Services
Manager
Activity
AndroidServices
SingletonServices
27
Threads
View Presenter
HumanService
Manage Threads
Services
Manager
DAO
Cancelable
KeepAlive
ThreadsPools
28
public class ServiceManager {
/**
* The list of the bound services to this used to unbind the service. A service is pointed by its serviceConnection. */
List<ServiceConnection> boundServices = null;
List<Service> serviceAndroid = null; List<ServiceBusiness> singletonServices = null;
/** * Empty constructor to instantiate the list of bound services */
private ServiceManager() {boundServices = new ArrayList<ServiceConnection>();...}
/** Destructor **/
/** * This method is called by MApplication to unbind all the services and let them die when your application die */
public synchronized void unbindAndDie() {// Browse all the services and unbind them all
for (ServiceConnection sConn : boundServices) {
//first unbind the service
MAppInstance.ins.getApplication().unbindService(sConn);
}
for (Service servAndroid: servicesAndroid) {
servAndroid = null;} boundServices.clear();
//Do the same with your Singleton Service
for (ServiceBuisness singleton : singletonServices) {
singleton=null;}
//Kill your executor services
//the ones that has to let your thread finish
//the ones that has to finish right now
}
Instanciation à la demande
29
private ExecutorService keepAliveThreadsExcecutor = null;
/*** @return the cancelableThreadsExceutor */
public final ExecutorService getKeepAliveThreadsExecutor() {
if (keepAliveThreadsExceutor == null) {
keepAliveThreadsExceutor = Executors.newFixedThreadPool(4, new BackgroundThreadFactory());
}
return keepAliveThreadsExceutor;
}
/**ShutDown the ExecutorService but wait for thread to finish their job */
private void killKeepAliveThreadExecutor() {
if (keepAliveThreadsExceutor != null) {
keepAliveThreadsExceutor.shutdown(); // Disable new tasks from being submitted
try {// as long as your threads hasn't finished
while (!keepAliveThreadsExceutor.isTerminated()) {
// Wait a while for existing tasks to terminate
if (!keepAliveThreadsExceutor.awaitTermination(5, TimeUnit.SECONDS)) {
// Cancel currently executing tasks
keepAliveThreadsExceutor.shutdown();
Log.e("MyApp", "Probably a memory leak here");
}
}
} catch (InterruptedException ie) { keepAliveThreadsExceutor.shutdownNow();
keepAliveThreadsExceutor=null;
Log.e("MyApp", "Probably a memory leak here too");
} }
keepAliveThreadsExceutor=null;}
Instanciation à la demande
30
Persister l'instanciation
Application
View Presenter
HumanService
LazyLoading
Services
Manager
DAO
Cancelable
KeepAlive
ThreadsPools
Ne pas suivre le cycle de vie des activités
mais le cycle de vie de l'application
31
Persister l'instanciation
Application
0-1
HumanService
Services
Manager
0-1
But wait !
AndroidServices
32
Persister l'instanciation
Application
0-1
HumanService
Services
Manager
0-1
Dead Lock occurs !
AndroidServices
Garde le Service en vie
(car conserve le ServiceManager en vie)
Garde l'application en vie
(car toujours Bound avec le ServiceManager)
33
Persister l'instanciation
Application
0-1
HumanService
Services
Manager
0-1
Dead Lock occurs !
AndroidServices
Garde le Service en vie
(car conserve le ServiceManager en vie)
Garde l'application en vie
(car toujours Bound avec le ServiceManager)
34
Persister l'instanciation
Application
0-1
HumanService
Services
Manager
0-1
Dead Lock occurs !
AndroidServices
Garde le Service en vie
(car conserve le ServiceManager en vie)
Garde l'application en vie
(car toujours Bound avec le ServiceManager)
35
Persister l'instanciation
Application
0-1
HumanService
Services
Manager
0-1
Dead Lock occurs !
AndroidServices
Ne pas suivre le cycle de vie des activités
mais le cycle de vie de l'application
La solution :
Cycle de vie de l'application
C'est quoi le cycle de vie de l'application ?
Quand il n'y a plus d'activités visibles depuis une
seconde, je peux considérer que mon application est
terminée.
Cycle de vie de l'application
Le one second pattern: A release memory pattern
IsActivity
Alive
37
Application
View
Services
Manager
onStop
onStart
Runnable mServiceKiller;
Launch it
In1Second
if(false) unbindAndDie()
if false
/** Destructor **/
/** * This method is called by MApplication to unbind all
the services and let them die when your application die */
public synchronized void unbindAndDie() {
// Browse all the services and unbind them all
for (ServiceConnection sConn : boundServices) {
//first unbind the service
unbindService(sConn);}
dService = null;boundServices.clear();}
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
public void onActivityStopped(Activity activity) {isActivityAlive.set(false);}
public void onActivityCreated(Activity activity) {isActivityAlive.set(true);}});
// launch the Runnable mServiceKiller in 1 seconds
getServiceKillerHanlder().postDelayed(getServiceKiller(), 1000);
IsActivity
Alive
Cycle de vie de l'application
Réagissez au CallBack onMemoryLow
ApplicationServices
Manager
onLowMemory (...)
System
unbindAndDie()
Le LazyLoading est votre philosophie
39
Assurer l'Asynchronicité
Sur Android, il faut être asynchrone, tous le monde le sait !
Ceux qui codent la couche DAO le savent
Ceux qui codent la couche vue le savent
Thread(Thread(Thread(Thread(do something))))
Ceux qui codent la couche de com le savent
Ceux qui codent la couche Service le savent
40
Assurer l'Asynchronicité
Un seule règle: La couche service est votre barrière
d'Asynchronicté.
Chaque méthode publique de chaque service s'exécute dans
un Thread.
Et nulle part ailleurs de Thread est lancé.
(à part les Animations Thread de gingerbread, putain de gingerbread)
41
Assurer l'Asynchronicité
public class MyBusinessService{...
public void loadDataAsync(int itemId) {
MyApp.instance.getServiceManager()
.getCancelableThreadsExecutor()
.submit(new RunnableLoadData(itemId));
}
private class RunnableLoadData implements Runnable {
public int itemId;
public RunnableLoadData(int itemId) {this.itemId=itemId}
public void run() {
loadDataSync(itemId);}
}
public void loadDataSync(int itemId) {
// your code here}
Assurer l'Asynchronicité
Vous pouvez utiliser PoolExecutor + Runnable
Vous pouvez utiliser les IntentService
Vous pouvez utiliser les AysncTask
https://www.youtube.com/watch?v=jtlRNNhane0&index=4&list=PLWz5rJ2
EKKc9CBxr3BVjPTPoDPLdPIFCE
Vous pouvez utiliser les HandlerThread
Vous pouvez utiliser les AysncTask
Chaque appel à un service se fait de manière asynchrone
43
HumanService
View Presenter
doSomething()
{
//code...
Human hum =getHumanService().getHuman("toto");
//other code using hum
txvHumanName.setText(hum.getName());
}
call
Failed
It's asynchronous
What we used to do
before
Asynchronicité
44
Services
View Presenter
doSomething()
{ getHumanService().getHuman("toto"); }
call
What we need to do now
doSomethingPart2(Human hum)
{ //other code using hum
txvHumanName.setText(hum.getName()
);}
async return
Yes
good way
Assurer l'Asynchronicité
Chaque appel à un service se fait de manière asynchrone
Les méthodes des Activités doivent être segmentées
Les instancier à la demande
45
Il faut qu'on arrive avec nos services métiers à:
ArchiDroid
Ne les instancier QU'une seule fois
Mettre en place l'asynchronicité
Ne pas suivre le cycle de vie des activités
mais le cycle de vie de l'application
Les laisser terminer leur traitement
Disponible sur mon GitHub
46
J'utilise le Live Template
Et le code
arch_Service_Method_WithArgs
arch_ServManager_CancelableThread
arch_ServManager_KeepAliveThread
arch_Service_Method
et plus ...
Architecture
But wait !
C'est pas un peu compliqué ton truc?
Pour la petite histoire
En upload
En download
Quelle est ma stratégie?
(oversync:(
G.U.I. Thread Background Thread
View Presenter
ServiceData
DataCom
DataDao
Services
Manager
ServiceUpdater
call
BIND
START
load
return data
Intent|Event
call
return data
Caching
return data
fire
DataUpdateEvent
Intent
ContentObserver
DownLoad
Application
TimeStamp
Quelle est ma stratégie?
(oversync:(
G.U.I. Thread Background Thread
View Presenter
ServiceData
DataCom
DataDao
Services
Manager
ServiceUpdater
call
BIND
START
load
return data
Intent|Event
call
return data
Caching
return data
fire
DataUpdateEvent
Intent
ContentObserver
DownLoad
Application
onStop
onCreate
G.U.I. Thread Background Thread
ViewPresenter
ServiceData
DataCom
DataDao
Services
Manager
ServiceUpdater
call
BIND
START
return data
Intent|Event
Caching
DownLoad
Application
onStop
onCreate
Quelle est ma stratégie?
(oversync:(
G.U.I. Thread Background Thread
View Presenter
ServiceData
DataCom
DataDao
Services
Manager
ServiceUpdater
call
BIND
START
save
call
Caching
UpLoad
TimeStamp
Application
TimeStamp
54
DataDaoServiceUpdater
push Message
GoogleCloud
Messaging
Quand il y a de nouvelles données à diffuser
+PayLoad + Token (DataVersion)
store
Backend server
BroadcastReceiver
start
WakeUp!
Vous êtes à jour
GoogleCloudMessaging
Les tests
Intégration et
Déploiement continue
Test
Merci AndroidStudio
Merci Gradle
Test
No test
No trust
Algo
Test
No test
No trust
Algo Unit
Test
No test
No trust
Algo Unit Locale
Test
No test
No trust
Algo VersionUnit Locale
Test
No test
No trust
Algo
Perm
VersionUnit Locale
Test
No test
No trust
Algo
Perm
VersionUnit
Screen
Dpi
Locale
Test
No test
No trust
Algo
Perm
Version
Screen
Size
Unit
Screen
Dpi
Locale
Test
No test
No trust
Algo
Perm
Version
Screen
Size
Intent
Unit
Screen
Dpi
Locale
Test
No test
No trust
Algo
Perm
Réseau
Version
Screen
Size
Intent
Unit
Screen
Dpi
Locale
Test
Vous devez tester toutes vos configurations matérielles
GooglePla
yServices
RéseauVersion
Screen
Size
Screen
Dpi
Locale
2316 463
6912
Test
Vous devez tester toutes vos configurations matérielles
GoogleP
S
RéseauVersion
Screen
Size
Screen
Dpi
Locale
2316 463
168
Test
Vous devez automatiser le passage des tests
Test
Comment on fait ?
Instrumentation
Tests
Unit Tests
S'exécute sur Android
Pas de fake du système
S'exécute sur la JVM
Fake des composants
système (Mockito)
Test
Unit Tests
public class ExampleUnitTest {
@Test
public void addition_isCorrect() throws Exception {
System.out.println("ExampleUnitTest");
assertEquals(4, 2 + 2);
}
}
Test
Instrumentation Tests
public class CityServiceTest extends AndroidTestCase {
public void setUp() {super.setUp();
EventBus.getDefault().register(this);
}
public void tearDown() { super.tearDown();
EventBus.getDefault().unregister(this);
}
public void testFindCityByNameAsync() {
MyApplication.instance
.getServiceManager()
.getCityService()
.findCityByNameAsync(testedCityName) }}
Test
Instrumentation Tests
@Subscribe
public void onEvent(FindCitiesResponseEvent event){
assertNotNull(event);
assertNotNull(event.getFindCitiesResponse());
assertNotNull(event.getFindCitiesResponse().getCities());
assertNotNull(event.getFindCitiesResponse().getCities().get(0))
DataCheck.getInstance()
.checkCity(event.getFindCitiesResponse().getCities().get(0));
}
Test
BroadcastReceiver
Communication
Com
D.A.O.
DAO
ExceptionManagerTools
Tester
Tests
JUNIT
Tests
Tests
Transverse
Transverse
Instrumentation
Tests
Unit Tests
Test
Mais là, comment on fait ?
Services
AndroidServices
SingletonServices
Service
knows Communication
Com
I
N
T
F
knows
D.A.O.
DAO
I
N
T
F
Tests
JUNIT
On joue avec les saveurs
?
?
?
Test
On joue avec les saveurs
et les injecteurs
Mais là, comment on fait ?
public class Injector {
public static ServiceManagerMocked getServiceManager(){
return new ServiceManagerMocked();
}
}
public class Injector {
public static ServiceManagerMocked getServiceManager(){
return new ServiceManager ();
}
}
Test
On joue avec les saveurs
et les injecteurs
Mais là, comment on fait ?
// If you need to add more flavors, consider using flavor dimensions.
productFlavors {
mock {
applicationIdSuffix = ".mock"
}
prod { }
}
Modèle n-tier
Services
AndroidServices
SingletonServices
Service
knows Communication
Com
I
N
T
F
knows
D.A.O.
DAO
I
N
T
F
Tests
JUNIT
Tester
mockDebug
Modèle n-tier
MockView
View = MVP
Presenter
ViewIntf
1
1
JUNIT
Services
AndroidServices
SingletonServices
Service
I
N
T
F
Tests
Tester
mockDebug
Modèle n-tier
View = MVP
Presenter
View
1
1
Services
AndroidServices
SingletonServices
Service
I
N
T
F
Espresso
AndroidTest SDK
Tests
Tester
mockDebug
Test
Et après ? Industrialisation via l'intégration continue.
mais c'est toujours un peu l'enfer... on ne vous le cache pas
Test
Et après ? Le déploiement continue.
Oui c'est possible.
Square
et les autres
Librairies
Un besoin
Une fonctionnalité
Une librairie
Utilisez une librairie parce que vous en avez besoin,
pas pour le plaisir !
Moins vous avez de librairies sur votre projet,
mieux vous vous porterez.
Choisissez avec attention vos librairies, c'est critique,
ne merdez pas.
Librairies
Avant tout
SupportLibrary
Librairies
Juste après
DesignLibrary
Librairies
Se simplifier la vie avec la couche de communication Http
Retrofit
90
public interface WebServerIntf {
/** Get Method
(this is the way to declare them using Retrofit 2.0)
@GET("posts/1")
Call<Post> getPostOne();
@GET("posts/{id}")
Call<Post> getPostById(@Path("id") int id);
@GET("posts")
Call<List<Post>> getPostsList();
}
Définition
getPostOneCall = getSimpleClient().getPostOne();
getPostOneCall.enqueue(new Callback<Post>() {
@Override
public void onResponse(Response<Post> response) {
}
@Override
public void onFailure(Throwable t) {
}
});
Usage
public static final String BASE_URL = "http://jsonplaceholder.typicode.com/";
public static WebServerIntf getSimpleClient(){
Retrofit ra=new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(MoshiConverterFactory.create())
.build();
WebServerIntf webServer=ra.create(WebServerIntf.class);
return webServer;
}
Instanciation
Retrofit
Librairies
Une couche Http sans bugs quelque soit la version
OkHttp
92
OkHttp
OkHttpClient client=null;
private OkHttpClient getClient(){
if(client==null) {
File myCacheDir = new File(getCacheDir(), "OkHttpCache");
int cacheSize = 1024 * 1024;
Cache cacheDir = new Cache(myCacheDir, cacheSize);
client = new OkHttpClient.Builder().cache(cacheDir).build();
}
return client;
}
Définition
93
OkHttp
String urlGet = "http://jsonplaceholder.typicode.com/posts/1";
private String getAStuff() throws IOException {
Request request = new Request.Builder()
.url(urlGet)
.get()
.build();
//the synchronous way (Here it's ok we are in an AsyncTask already)
Response response = getClient().newCall(request).execute();
String ret = response.body().string();
response.body().close();
return ret;
}
Utilisation
Librairies
Optimiser les écritures disques
Okio
95
OkIo
/** * Read the file you just create */
private void readCachFile() {
//open
File myFile = new File(getCacheDir(), "myFile");
try {
BufferedSource okioBufferSrce = Okio.buffer(Okio.source(myFile));
str = okioBufferSrce.readUtf8();
//don't forget to close, else nothing appears
okioBufferSrce.close();
}}
96
OkIo
/** * Write a file */
private void writeCachFile() {
//open
File myFile = new File(getCacheDir(), "myFile");
//then write
if (!myFile.exists()) {myFile.createNewFile();}
BufferedSink okioBufferSink = Okio.buffer(Okio.sink(myFile));
okioBufferSink.writeUtf8(str);
//don't forget to close, else nothing appears
okioBufferSink.close();
}
Librairies
Optimiser la manipulation JSon
Moshi
98
Moshi
Moshi moshi = new Moshi.Builder().build();
JsonAdapter<MyJsonObject> adapter = moshi.adapter(MyJsonObject.class);
MyJsonObject myObj=null;
//write
File myFile = new File(ctx.getCacheDir(), "myJsonObjectFile");
BufferedSink okioBufferSink = Okio.buffer(Okio.sink(myFile));
adapter.toJson(okioBufferSink, new MyJsonObject());
//don't forget to close, else nothing appears
okioBufferSink.close();
99
Moshi
Moshi moshi = new Moshi.Builder().build();
JsonAdapter<MyJsonObject> adapter = moshi.adapter(MyJsonObject.class);
MyJsonObject myObj=null;
//or read
BufferedSource okioBufferSource = Okio.buffer(Okio.source(myFile));
myObj = adapter.fromJson(okioBufferSource);
Librairies
Cohérence des librairies
Retrofit
OkHttp
OkIo
Moshi
Librairies
Supprimer les Intents pour la communication interne
Les bus évènementiels
OTTO EventBus
Librairies
Supprimer les Intents pour la communication interne
Les bus évènementiels
OTTO EventBus
A n'utiliser que pour les retours d'appels ou les évènements
EventBus
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(ErrorEvent event){
int errorMessageId=event.getErrorMessageId();
String errorMessage;
if(errorMessageId==0){
errorMessage=event.getErrorMessage();
}else{
errorMessage=getResources().getString(errorMessageId);
}
displayError(errorMessage);
}
EventBus.getDefault().post(ErrorEvent);
GreenDao
Librairies
Se simplifier la couche DAO
Les O.R.M
SugarOrm OrmLite
Realm
public class City extends SugarRecord {
private int cityId;
private String name;
private Coordinates coordinates;
@Ignore
private List<WeatherMetaData_City> metaDataList = null;
/**Because of SugarOrm bad management of one to many relationship*/
public List<WeatherMetaData_City> getMetaDataList() {
if(metaDataList==null){
//load them
metaDataList= WeatherMetaData_City.find(WeatherMetaData_City.class,
"CITY = ?", Long.toString(getId()));
}
return metaDataList;
}
SugarOrm
SugarOrm
public long save(City city){
long id;
//you need to manually save others elements (first)
Coordinates.save(city.getCoordinates());
WeatherDetails.save(city.getWeatherDetails());
Wind.save(city.getWind());
Clouds.save(city.getClouds());
Ephemeris.save(city.getEphemeris());
id = City.save(city);
SugarOrm
public void delete(City city){
if(city.getId()!=null) {
//you need to manually delete others elements (first)
Coordinates.delete(city.getCoordinates());
WeatherDetails.delete(city.getWeatherDetails());
Wind.delete(city.getWind());
Clouds.delete(city.getClouds());
Ephemeris.delete(city.getEphemeris());
City.delete(city);
}
}
SugarOrm
List<City> cities= City.find(City.class, "CITY_ID =?", Integer.toString(cityId));
Librairies
Analyse du besoin utilisateur
Fabric (CrashLytics)
Analytics For Android Flurry
Librairies
Simplifier le téléchargement d'images vers les ImageView
Glide Picasso
Librairies
Gestion des Fonts
Calligraphy
Librairies
Gestion des Dates
JodaTime
Librairies
Stratégie de mises à jour
GoogleCloudMessaging
Librairies
Le futur
RxJava Realm
Retrofit
Kotlin
G.U.I. Thread Background Thread
View Model
ServiceData
DataCom
DataDao
Services
Manager
ServiceUpdater
Caching
DownLoad
Application
TimeStamp
Retrofit
SugarOrm
Dagger
EventBusEventBus
Librairies pour les Tests
Librairies
L'inversion de contrôle pour les tests
(et injecter le bon contexte prod/mock)
Dagger
IOC sur Android est un suicide
Librairies
Librairies
Pour Mocker (parodier) les objets et jouer des tests unitaires
Mockito
Librairies
Pour tester les IHM
Espresso
Librairies
Pour remonter les bugs à l'équipe de développement
Crashlytics
Librairies
Pour surveiller les fuites mémoires
CanaryLeaks
Librairies
Librairies
Pour exécuter ses tests sur un émulateur
Genymotion
Librairies
Pour exécuter ses tests en parallèle (et capture d'écran)
Spoon
Librairies
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:recyclerview-v7:23.1.1'
compile 'com.android.support:cardview-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
// I want eventBus
compile 'org.greenrobot:eventbus:3.0.0'
// I want SugarOrm
compile 'com.github.satyan:sugar:1.4'
// I want Retrofit,OkIo, OkHttp and Moshi
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta3'
compile 'com.squareup.okhttp3:okhttp:3.0.0-RC1'
compile 'com.squareup.retrofit2:converter-moshi:2.0.0-beta3'
compile 'com.squareup.okhttp3:logging-interceptor:3.0.0-RC1'
compile 'com.squareup.okio:okio:1.6.0'
// I want Dagger 2
//I want JodaTime not to drive nuts managing date
compile 'net.danlew:android.joda:2.9.2'
//For the Tests !!!
// Dependencies for unit tests
testCompile 'junit:junit:4.12'
//for unit tests
testCompile "org.mockito:mockito-all:$rootProject.ext.mockitoVersion"
// Android Testing Support Library's runner and rules
androidTestCompile "com.android.support.test:runner:$rootProject.ext.runnerVersion"
androidTestCompile "com.android.support.test:rules:$rootProject.ext.rulesVersion"
// Espresso UI Testing dependencies.
androidTestCompile "com.android.support.test.espresso:espresso-core:$rootProject.ext.espressoVersion"
androidTestCompile "com.android.support.test.espresso:espresso-intents:$rootProject.ext.espressoVersion"
// Espresso-contrib for DatePicker, RecyclerView, Drawer actions, Accessibility checks, CountingIdlingResource
androidTestCompile "com.android.support.test.espresso:espresso-contrib:$rootProject.ext.espressoVersion"
compile "com.android.support.test.espresso:espresso-idling-resource:$rootProject.ext.espressoVersion"
}
la météo
sur github
Tuto sur Github
Le projet ForecastYahooRest
articles
et conférences
Must read/watch
https://medium.com/@chethaase
https://www.youtube.com/watch?v=BlkJzgjzL0c&list=PLWz5rJ2EKKc_Tt7q77qwyKRgytF1RzRx8&index=2
https://skillsmatter.com/skillscasts/5971-an-android-journey
https://www.youtube.com/watch?v=br3drCNFti8
https://www.youtube.com/watch?v=WvyScM_S88c
https://www.youtube.com/watch?v=KIAoQbAu3eA
Architecture
https://github.com/konmik/konmik.github.io/wiki/Introduction-to-Model-View-Presenter-on-Android
https://vaadin.com/blog/-/blogs/is-mvp-a-best-practice-
http://blog.cleancoder.com/uncle-bob/2016/01/04/ALittleArchitecture.html
http://fr.slideshare.net/pileromain/ingredients-for-a-healthy-codebase
https://github.com/ivacf/archi
https://speakerdeck.com/rallat/android-development-like-a-pro
https://github.com/reark/reark
https://medium.com/android-news/android-architecture-2f12e1c7d4db#.e4z6np1sn
http://blog.sqisland.com/2015/11/mvp-missing-link.html
Librairies
Architecture (suite)
http://fr.slideshare.net/DarxVal/model-view-presenter-presentation
http://aviadezra.blogspot.fr/2009/08/mvp-mvvm-winforms-data-binding.html
https://blogs.msdn.microsoft.com/erwinvandervalk/2009/08/14/the-difference-between-model-view-viewmodel-and-
other-separated-presentation-patterns/
Tour d'horizon et bonne pratique
http://blog.octo.com/retour-dexperience-mobile-le-monde-partie-2/
https://github.com/futurice/android-best-practices
http://www.curious-creature.com/2008/12/18/avoid-memory-leaks-on-android/
Librairie
http://square.github.io/retrofit/http://inthecheesefactory.com/blog/retrofit-2.0/en
https://speakerdeck.com/jakewharton/simple-http-with-retrofit-2-droidcon-nyc-2015
https://github.com/codepath/android_guides/wiki/Must-Have-Libraries
https://docs.google.com/presentation/d/1BzFcK2t_PdkM6tQZIhpx8yeeIxaB15mf6U6kzvSnE90/edit#slide=id.p
https://android-arsenal.com/
Librairies
Tests, Intégration continue et déploiement continue
http://jeremie-martinez.com/2016/01/14/devops-on-android/
http://chiuki.github.io/advanced-android-espresso/#/
https://www.youtube.com/watch?v=JlHJFZvZyxw
http://developer.android.com/training/testing/start/index.html
https://speakerdeck.com/tguerin/robotium-vs-espresso
https://docs.google.com/presentation/d/10Y9wGn1tgIasq6DqG30Qz27KJlndZAoHX1KI41aNkdM/edit#slide=id.g2a03d
18b6_080
http://robolectric.org/writing-a-test/
https://corner.squareup.com/2013/04/the-resurrection-of-testing-for-android.html
https://www.youtube.com/watch?v=3WONuRSUHmw
http://riggaroo.co.za/setting-circle-ci-test-deploy-build-android-app/
https://google.github.io/android-testing-support-library/downloads/release-notes/
Google Tests Lab
https://developers.google.com/cloud-test-lab/overview#devicetypes
GCM NetworkManager
https://www.bignerdranch.com/blog/optimize-battery-life-with-androids-gcm-network-manager/
http://developer.android.com/training/efficient-downloads/efficient-network-access.html#RadioStateMachine
Je cherche un client
Pour m'engager
Sur la réussite de son produit Android
(avec un objectif de haute qualité)
en remote (ou Presque)
en tant que tech lead
en freelance
Lieu : Paris
Date : 10 - 13 Mai 2016
Durée : 4 jours
138
Lieu : Lyon
Date : 23 - 27 Mai 2016
Durée : 5 jours
Lieu : Paris
Date : 06 - 10 Juin 2016
Durée : 5 jours
#android2ee
mathias.seguy@android2ee.com
www.android2ee.com
Thank you!Mathias Seguy
Android2EE
@android2ee
Slides:
http://fr.slideshare.net/Android2EE
Code:
https://github.com/MathiasSeguy-Android2EE
Android2EE
http://android2ee.com
Thank you!Mathias Seguy
Android2EE
@android2ee
Slides:
http://fr.slideshare.net/Android2EE
Code:
https://github.com/MathiasSeguy-Android2EE
Android2EE
http://android2ee.com

Contenu connexe

Tendances

Android - Tp1 - installation et démarrage
Android - Tp1 -   installation et démarrageAndroid - Tp1 -   installation et démarrage
Android - Tp1 - installation et démarrageLilia Sfaxi
 
Initiation Android Niveau Débutant
Initiation Android Niveau DébutantInitiation Android Niveau Débutant
Initiation Android Niveau DébutantNadim GOUIA
 
Aspect avec AspectJ
Aspect avec AspectJAspect avec AspectJ
Aspect avec AspectJsimeon
 
Les ateliers android_1_vers2015
Les ateliers android_1_vers2015Les ateliers android_1_vers2015
Les ateliers android_1_vers2015Sabeur LAJILI
 
P2 éléments graphiques android
P2 éléments graphiques androidP2 éléments graphiques android
P2 éléments graphiques androidLilia Sfaxi
 
Titanium studio et les modules
Titanium studio et les modulesTitanium studio et les modules
Titanium studio et les modulesGautier Pialat
 
Android-Tp4: stockage
Android-Tp4: stockageAndroid-Tp4: stockage
Android-Tp4: stockageLilia Sfaxi
 
Java entreprise edition et industrialisation du génie logiciel par m.youssfi
Java entreprise edition et industrialisation du génie logiciel par m.youssfiJava entreprise edition et industrialisation du génie logiciel par m.youssfi
Java entreprise edition et industrialisation du génie logiciel par m.youssfiENSET, Université Hassan II Casablanca
 
Connexion jdbc
Connexion jdbcConnexion jdbc
Connexion jdbcInes Ouaz
 
Fast and Furious XAML Apps!
Fast and Furious XAML Apps!Fast and Furious XAML Apps!
Fast and Furious XAML Apps!Microsoft
 
Jug Lausanne Android Janvier2013
Jug Lausanne Android Janvier2013Jug Lausanne Android Janvier2013
Jug Lausanne Android Janvier2013jeromevdl
 
Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)Eric SIBER
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EEInes Ouaz
 

Tendances (18)

Android
AndroidAndroid
Android
 
Mvc (5)
Mvc (5)Mvc (5)
Mvc (5)
 
Android - Tp1 - installation et démarrage
Android - Tp1 -   installation et démarrageAndroid - Tp1 -   installation et démarrage
Android - Tp1 - installation et démarrage
 
Cours 1 Android
Cours 1 AndroidCours 1 Android
Cours 1 Android
 
Initiation Android Niveau Débutant
Initiation Android Niveau DébutantInitiation Android Niveau Débutant
Initiation Android Niveau Débutant
 
Support POO Java Deuxième Partie
Support POO Java Deuxième PartieSupport POO Java Deuxième Partie
Support POO Java Deuxième Partie
 
Aspect avec AspectJ
Aspect avec AspectJAspect avec AspectJ
Aspect avec AspectJ
 
Les ateliers android_1_vers2015
Les ateliers android_1_vers2015Les ateliers android_1_vers2015
Les ateliers android_1_vers2015
 
Support cours angular
Support cours angularSupport cours angular
Support cours angular
 
P2 éléments graphiques android
P2 éléments graphiques androidP2 éléments graphiques android
P2 éléments graphiques android
 
Titanium studio et les modules
Titanium studio et les modulesTitanium studio et les modules
Titanium studio et les modules
 
Android-Tp4: stockage
Android-Tp4: stockageAndroid-Tp4: stockage
Android-Tp4: stockage
 
Java entreprise edition et industrialisation du génie logiciel par m.youssfi
Java entreprise edition et industrialisation du génie logiciel par m.youssfiJava entreprise edition et industrialisation du génie logiciel par m.youssfi
Java entreprise edition et industrialisation du génie logiciel par m.youssfi
 
Connexion jdbc
Connexion jdbcConnexion jdbc
Connexion jdbc
 
Fast and Furious XAML Apps!
Fast and Furious XAML Apps!Fast and Furious XAML Apps!
Fast and Furious XAML Apps!
 
Jug Lausanne Android Janvier2013
Jug Lausanne Android Janvier2013Jug Lausanne Android Janvier2013
Jug Lausanne Android Janvier2013
 
Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EE
 

En vedette

Architecture et Bonnes pratiques Android #DevoxxFr2016 Part1
Architecture et Bonnes pratiques Android #DevoxxFr2016 Part1Architecture et Bonnes pratiques Android #DevoxxFr2016 Part1
Architecture et Bonnes pratiques Android #DevoxxFr2016 Part1Mathias Seguy
 
Google Plus SignIn : l'Authentification Google
Google Plus SignIn : l'Authentification GoogleGoogle Plus SignIn : l'Authentification Google
Google Plus SignIn : l'Authentification GoogleMathias Seguy
 
Treatment, Architecture and Threads
Treatment, Architecture and ThreadsTreatment, Architecture and Threads
Treatment, Architecture and ThreadsMathias Seguy
 
ProTips DroidCon Paris 2013
ProTips DroidCon Paris 2013ProTips DroidCon Paris 2013
ProTips DroidCon Paris 2013Mathias Seguy
 
Eclispe daytoulouse combining the power of eclipse with android_fr_1024_768_s...
Eclispe daytoulouse combining the power of eclipse with android_fr_1024_768_s...Eclispe daytoulouse combining the power of eclipse with android_fr_1024_768_s...
Eclispe daytoulouse combining the power of eclipse with android_fr_1024_768_s...Mathias Seguy
 
Animate Me, if you don't do it for me do it for chet (DroidCon Paris)
Animate Me, if you don't do it for me do it for chet (DroidCon Paris)Animate Me, if you don't do it for me do it for chet (DroidCon Paris)
Animate Me, if you don't do it for me do it for chet (DroidCon Paris)Mathias Seguy
 
Voyage en monde Android. Trucs et astuces tout au long de la route.
Voyage en monde Android. Trucs et astuces tout au long de la route.Voyage en monde Android. Trucs et astuces tout au long de la route.
Voyage en monde Android. Trucs et astuces tout au long de la route.Mathias Seguy
 
Android2EE training: Tutorials list of Android projects
Android2EE training: Tutorials list of Android projectsAndroid2EE training: Tutorials list of Android projects
Android2EE training: Tutorials list of Android projectsMathias Seguy
 
Présentation et bonnes pratiques du pattern MVVM - MIC Belgique
Présentation et bonnes pratiques du pattern MVVM - MIC BelgiquePrésentation et bonnes pratiques du pattern MVVM - MIC Belgique
Présentation et bonnes pratiques du pattern MVVM - MIC BelgiqueDenis Voituron
 
Android Processes, Threads Slidenerd Style
Android Processes, Threads Slidenerd StyleAndroid Processes, Threads Slidenerd Style
Android Processes, Threads Slidenerd Styleayman diab
 
The Nervous System
The Nervous SystemThe Nervous System
The Nervous SystemVijay A Raj
 
Red Hat OpenStack Technical Overview
Red Hat OpenStack Technical OverviewRed Hat OpenStack Technical Overview
Red Hat OpenStack Technical Overviewayman diab
 
Android Material Design Slidenerd Style
Android Material Design Slidenerd StyleAndroid Material Design Slidenerd Style
Android Material Design Slidenerd Styleayman diab
 
WordPress for Beginners Create Professional Websites
WordPress for Beginners Create Professional WebsitesWordPress for Beginners Create Professional Websites
WordPress for Beginners Create Professional Websitesayman diab
 
Tech Talk #2: Android app performance tips
Tech Talk #2: Android app performance tipsTech Talk #2: Android app performance tips
Tech Talk #2: Android app performance tipsNexus FrontierTech
 
Animate Me! if you don't do it for me, do it for Chet - DroidconLondon2015
Animate Me! if you don't do it for me, do it for Chet - DroidconLondon2015Animate Me! if you don't do it for me, do it for Chet - DroidconLondon2015
Animate Me! if you don't do it for me, do it for Chet - DroidconLondon2015Mathias Seguy
 

En vedette (20)

Architecture et Bonnes pratiques Android #DevoxxFr2016 Part1
Architecture et Bonnes pratiques Android #DevoxxFr2016 Part1Architecture et Bonnes pratiques Android #DevoxxFr2016 Part1
Architecture et Bonnes pratiques Android #DevoxxFr2016 Part1
 
Google Plus SignIn : l'Authentification Google
Google Plus SignIn : l'Authentification GoogleGoogle Plus SignIn : l'Authentification Google
Google Plus SignIn : l'Authentification Google
 
Treatment, Architecture and Threads
Treatment, Architecture and ThreadsTreatment, Architecture and Threads
Treatment, Architecture and Threads
 
ProTips DroidCon Paris 2013
ProTips DroidCon Paris 2013ProTips DroidCon Paris 2013
ProTips DroidCon Paris 2013
 
Eclispe daytoulouse combining the power of eclipse with android_fr_1024_768_s...
Eclispe daytoulouse combining the power of eclipse with android_fr_1024_768_s...Eclispe daytoulouse combining the power of eclipse with android_fr_1024_768_s...
Eclispe daytoulouse combining the power of eclipse with android_fr_1024_768_s...
 
Animate Me, if you don't do it for me do it for chet (DroidCon Paris)
Animate Me, if you don't do it for me do it for chet (DroidCon Paris)Animate Me, if you don't do it for me do it for chet (DroidCon Paris)
Animate Me, if you don't do it for me do it for chet (DroidCon Paris)
 
Voyage en monde Android. Trucs et astuces tout au long de la route.
Voyage en monde Android. Trucs et astuces tout au long de la route.Voyage en monde Android. Trucs et astuces tout au long de la route.
Voyage en monde Android. Trucs et astuces tout au long de la route.
 
Bonnes pratiques développement android
Bonnes pratiques développement androidBonnes pratiques développement android
Bonnes pratiques développement android
 
Android2EE training: Tutorials list of Android projects
Android2EE training: Tutorials list of Android projectsAndroid2EE training: Tutorials list of Android projects
Android2EE training: Tutorials list of Android projects
 
Présentation et bonnes pratiques du pattern MVVM - MIC Belgique
Présentation et bonnes pratiques du pattern MVVM - MIC BelgiquePrésentation et bonnes pratiques du pattern MVVM - MIC Belgique
Présentation et bonnes pratiques du pattern MVVM - MIC Belgique
 
5.ateliers avancés
5.ateliers avancés5.ateliers avancés
5.ateliers avancés
 
Android Processes, Threads Slidenerd Style
Android Processes, Threads Slidenerd StyleAndroid Processes, Threads Slidenerd Style
Android Processes, Threads Slidenerd Style
 
The Nervous System
The Nervous SystemThe Nervous System
The Nervous System
 
Red Hat OpenStack Technical Overview
Red Hat OpenStack Technical OverviewRed Hat OpenStack Technical Overview
Red Hat OpenStack Technical Overview
 
Android Material Design Slidenerd Style
Android Material Design Slidenerd StyleAndroid Material Design Slidenerd Style
Android Material Design Slidenerd Style
 
WordPress for Beginners Create Professional Websites
WordPress for Beginners Create Professional WebsitesWordPress for Beginners Create Professional Websites
WordPress for Beginners Create Professional Websites
 
Fun with RecyclerView
Fun with RecyclerViewFun with RecyclerView
Fun with RecyclerView
 
Tech Talk #2: Android app performance tips
Tech Talk #2: Android app performance tipsTech Talk #2: Android app performance tips
Tech Talk #2: Android app performance tips
 
Recyclerview in action
Recyclerview in action Recyclerview in action
Recyclerview in action
 
Animate Me! if you don't do it for me, do it for Chet - DroidconLondon2015
Animate Me! if you don't do it for me, do it for Chet - DroidconLondon2015Animate Me! if you don't do it for me, do it for Chet - DroidconLondon2015
Animate Me! if you don't do it for me, do it for Chet - DroidconLondon2015
 

Similaire à Architecture et Bonnes pratiques Android #DevoxxFr2016 Part2

Projet de fin d étude (1)
Projet de fin d étude (1)Projet de fin d étude (1)
Projet de fin d étude (1)Sanaa Guissar
 
4 asynch task_services_thread
4 asynch task_services_thread4 asynch task_services_thread
4 asynch task_services_threadSaber LAJILI
 
Design applicatif avec symfony2
Design applicatif avec symfony2Design applicatif avec symfony2
Design applicatif avec symfony2RomainKuzniak
 
Architecture microservices avec docker
Architecture microservices avec dockerArchitecture microservices avec docker
Architecture microservices avec dockergcatt
 
4 asynch task_services_thread
4 asynch task_services_thread4 asynch task_services_thread
4 asynch task_services_threadSaber LAJILI
 
cours Android.pptx
cours Android.pptxcours Android.pptx
cours Android.pptxYaminaGh1
 
Cycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidCycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidHoussem Lahiani
 
Introduction au développement Android
Introduction au développement AndroidIntroduction au développement Android
Introduction au développement AndroidSteve Tremblay
 
Introduction_Android_-_Complet.pdf
Introduction_Android_-_Complet.pdfIntroduction_Android_-_Complet.pdf
Introduction_Android_-_Complet.pdfmed_univ78
 
Formation iPhone ENSI by (Orange Tunisie)
Formation iPhone ENSI by (Orange Tunisie)Formation iPhone ENSI by (Orange Tunisie)
Formation iPhone ENSI by (Orange Tunisie)Farouk Mezghich
 
Introduction aux architectures des SI
Introduction aux architectures des SI Introduction aux architectures des SI
Introduction aux architectures des SI Heithem Abbes
 
Les vrais enjeux de l'IA.pdf
Les vrais enjeux de l'IA.pdfLes vrais enjeux de l'IA.pdf
Les vrais enjeux de l'IA.pdfBabacarDIOP48
 
applications-reparties
applications-repartiesapplications-reparties
applications-repartiesmourad50
 

Similaire à Architecture et Bonnes pratiques Android #DevoxxFr2016 Part2 (20)

Projet de fin d étude (1)
Projet de fin d étude (1)Projet de fin d étude (1)
Projet de fin d étude (1)
 
Android
AndroidAndroid
Android
 
My droid
My droidMy droid
My droid
 
Android201710 avrilcours3
Android201710 avrilcours3Android201710 avrilcours3
Android201710 avrilcours3
 
4 asynch task_services_thread
4 asynch task_services_thread4 asynch task_services_thread
4 asynch task_services_thread
 
Design applicatif avec symfony2
Design applicatif avec symfony2Design applicatif avec symfony2
Design applicatif avec symfony2
 
Architecture microservices avec docker
Architecture microservices avec dockerArchitecture microservices avec docker
Architecture microservices avec docker
 
4 asynch task_services_thread
4 asynch task_services_thread4 asynch task_services_thread
4 asynch task_services_thread
 
cours Android.pptx
cours Android.pptxcours Android.pptx
cours Android.pptx
 
Cycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidCycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'Android
 
Introduction au développement Android
Introduction au développement AndroidIntroduction au développement Android
Introduction au développement Android
 
JADE_C1.pdf
JADE_C1.pdfJADE_C1.pdf
JADE_C1.pdf
 
Introduction_Android_-_Complet.pdf
Introduction_Android_-_Complet.pdfIntroduction_Android_-_Complet.pdf
Introduction_Android_-_Complet.pdf
 
Formation iPhone ENSI by (Orange Tunisie)
Formation iPhone ENSI by (Orange Tunisie)Formation iPhone ENSI by (Orange Tunisie)
Formation iPhone ENSI by (Orange Tunisie)
 
Introduction aux architectures des SI
Introduction aux architectures des SI Introduction aux architectures des SI
Introduction aux architectures des SI
 
Cours android
Cours androidCours android
Cours android
 
Cours Android
Cours AndroidCours Android
Cours Android
 
Support de cours Spring M.youssfi
Support de cours Spring  M.youssfiSupport de cours Spring  M.youssfi
Support de cours Spring M.youssfi
 
Les vrais enjeux de l'IA.pdf
Les vrais enjeux de l'IA.pdfLes vrais enjeux de l'IA.pdf
Les vrais enjeux de l'IA.pdf
 
applications-reparties
applications-repartiesapplications-reparties
applications-reparties
 

Architecture et Bonnes pratiques Android #DevoxxFr2016 Part2

Notes de l'éditeur

  1. 30 minutes
  2. En effet, les vues possèdent le MVP qui est rodé et sont gérées plus ou moins directement par le système Les couches Com et Dao n'ont rien de particulières dans ce système Il nous reste donc à affiner les services, leur instanciations, leur fonctionnement
  3. Le point fondamental de toute application est l'utilisation de l'objet application
  4. Le point fondamental de toute application est l'utilisation de l'objet application
  5. Tu dois te l'approprier car tu vas en avoir besoin un peu partout dans ton app.
  6. Le principe du Singleton est ultra important, la question que je me pose encore est quand est-ce qu'il doit être garbage collecté et si ça pose un problème.
  7. Le principe du Singleton est ultra important, la question que je me pose encore est quand est-ce qu'il doit être garbage collecté et si ça pose un problème.
  8. Le point fondamental de toute application est l'utilisation de l'objet application
  9. HandlerThread, c'est comme l'IntentService, ca nous donne un Thread avec son looper Pourquoi pas les AsyncTask... ben c'est que c'est facile de All Asynctask will use the same thread to execute themself=> it will be executed in sequential (can kill your work) How can you cancel an AsyncTask ??? => en fait n'annule pas la task mais annule le bordel et on passe dans onCancel et pas dans onPostExecite MemoryLeak (AsyncTask declare as an inner class of the Activity fuite memoire commune, ou qui pointe vers un champ de l'activité...)
  10. Pour la petite histoire, j'ai commence deux app dernièrement, l'une c'est le tp de cette conf et l'autre c'était pour moi, pour arreter de fumer et me motive Bon dans la première j'ai mis de facto ce que je vous ai dit et dans la seconde, j'ai commence cool, en mode lazy feature mais petit à petit ben je les ai toutes implémentées car plus le projet avance plus il se complexifie plus on y ajoute les techniques d'architecture que je viens de vous expliquer. Elles viennent naturelement résoudre les problèmes qui se soulèvent.
  11. 15 minutes
  12. Inspiré de la Vidéo de DevSummit et en particluier son l'exemple
  13. C'est là où GCManager ou JobScheduler entrent en action
  14. 10 minutes
  15. Quand on parle de test, la première chose qui me vient à l'esprit c'est merci AndroidStudio Merci Gradle Parce que Eclipse + Maven c'était juste l'enfer
  16. No test no trust
  17. No test no trust
  18. No test no trust
  19. No test no trust
  20. No test no trust
  21. No test no trust
  22. No test no trust
  23. No test no trust
  24. No test no trust
  25. Version de 8 à 24 Locale Fr, En, Es Screen density: l,m,h,xh,xxh,xxxh Screen size: s,n,l,xl Réseau Wifi, 3 g, edge Autres: ca peut être poru chaque permission accepté/pas accepté ou poru les ressources présente GPS ou pas GoolgePlayService ou pas...
  26. On va séparer en Gui / not Gui
  27. 16*3=48 3*6*4=72
  28. 16*3=48 3*6*4=72
  29. Avantage: Rapide mais s'execute dans la JVM aucune brique android On peut utiliser Mockito pour Mock les objets du système
  30. S'execute sur un Appareil (émulateur ou reel) Possède tout l'environnement Android pour s'exécuter
  31. S'execute sur un Appareil (émulateur ou reel) Possède tout l'environnement Android pour s'exécuter
  32. Car ils ne dependent de personne
  33. Parce que là, il y a le problème de l'isolation de la couche service poru s'assurer des résultat
  34. Parce que là, il y a le problème de l'isolation de la couche service poru s'assurer des résultat
  35. Parce que là, il y a le problème de l'isolation de la couche service poru s'assurer des résultat
  36. JUnit et bouchons
  37. Parce que là, il y a le problème de l'isolation de la couche service poru s'assurer des résultat
  38. Parce que là, il y a le problème de l'isolation de la couche service poru s'assurer des résultat
  39. 20 minutes
  40. Parce que là, il y a le problème de l'isolation de la couche service poru s'assurer des résultat
  41. Parce que là, il y a le problème de l'isolation de la couche service poru s'assurer des résultat
  42. Parce que là, il y a le problème de l'isolation de la couche service poru s'assurer des résultat
  43. Parce que là, il y a le problème de l'isolation de la couche service poru s'assurer des résultat
  44. Ce qui vous permet de vous concentrer sur l'important: Algo des services et des vues
  45. Mock=parodier/moquer/imiter/duper