Android pour les développeurs J2EE
Un modèle asynchrone pour les clients web
VII. AVAT- Exemple 4▲
VII-A. Le projet▲
L'application de ce nouvel exemple a elle également l'architecture suivante :
La couche [AVAT] est seule et sans tâches asynchrones.
L'application aura deux vues. La première est la même que dans l'exemple précédent :
A l'exécution, l'action [Action_01] se contentera de renvoyer à la vue les informations que celles-ci lui aura données. La vue [Vue_01] mettra alors ces informations dans une session et demandera à l'activité Android d'afficher une seconde vue [Vue_02]. Celle-ci affichera alors les informations trouvées dans la session. La vue [Vue_02] est la suivante :
Elle réaffiche en rouge les données qu'elle a trouvées dans la session. Le bouton [Retour] ramène à la vue [Vue_01].
VII-B. Le projet Eclipse▲
Le projet Eclipse de cet exemple est le suivant :
en [1], le projet [android-ui4] est un projet Maven ayant une dépendance sur le projet [android-avat] ;
en [2], les sources du projet :
le package [istia.st.avat-exemples.vues] rassemble les vues du projet, ici deux vues ;
le package [istia.st.avat-exemples.actions] rassemble les actions du projet, ici une action ;
le package [istia.st.avat-exemples.activity] contient l'activité Android [MainActivity], la fabrique d'objets [Factory], une classe de configuration [Config] et une implémentation de l'interface [ISession].
VII-C. La session▲
Rappelons la définition de l'interface [ISession] du modèle AVAT :
Sélectionnez 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
package
istia.st.avat.core;
public
interface
ISession {
void
add
(
String id, Object value);
void
remove
(
String id);
Object get
(
String id);
void
clear
(
);
}
La classe [Session] l'implémente de la façon suivante :
Sélectionnez 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32.
package
istia.st.avat.exemples.activity;
import
istia.st.avat.core.ISession;
import
java.util.HashMap;
import
java.util.Map;
public
class
Session implements
ISession {
Map<
String, Object>
session =
new
HashMap<
String, Object>
(
);
public
void
add
(
String id, Object value) {
session.put
(
id, value);
}
public
void
remove
(
String id) {
session.remove
(
id);
}
public
Object get
(
String id) {
return
session.get
(
id);
}
public
void
clear
(
) {
session.clear
(
);
}
}
VII-D. L'activité Android▲
Jusqu'à maintenant, l'activité Android n'affichait qu'une vue. Nous la modifions pour qu'elle puisse afficher n'importe quelle vue. Son code devient le suivant :
Sélectionnez 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40.
package
istia.st.avat.exemples.activity;
...
public
class
MainActivity extends
FragmentActivity {
private
Factory factory;
private
Vue[] vues;
@
Override
protected
void
onCreate
(
Bundle savedInstanceState) {
super
.onCreate
(
savedInstanceState);
requestWindowFeature
(
Window.FEATURE_INDETERMINATE_PROGRESS);
setProgressBarIndeterminateVisibility
(
false
);
setContentView
(
R.layout.main);
factory =
new
Factory
(
this
, new
Config
(
));
Vue_01 vue_01 =
(
Vue_01) factory.getObject
(
Factory.VUE_01, null
, "
Vue_01
"
);
Vue_02 vue_02 =
(
Vue_02) factory.getObject
(
Factory.VUE_02, null
, "
Vue_02
"
);
vues =
new
Vue[] {
vue_01, vue_02 }
;
showVue
(
1
);
}
public
void
showVue
(
int
i) {
FragmentTransaction fragmentTransaction =
getFragmentManager
(
).beginTransaction
(
);
fragmentTransaction.replace
(
R.id.container, vues[i -
1
]);
fragmentTransaction.commit
(
);
}
}
Nous ne commentons que ce qui change :
lignes 23-24 : les deux vues sont instanciées par la fabrique ;
ligne 26 : leurs références sont stockées dans un tableau défini ligne 10 ;
ligne 28 : la première vue est affichée via une méthode interne [showVue]. Les vues, qui ont accès à l'activité, demanderont le changement de vue par cette méthode.
VII-E. L'action [Action_01]▲
L'action [Action_01] se contente de renvoyer à la vue les informations que celles-ci lui a transmises. Son code est le suivant :
Sélectionnez 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
package
istia.st.avat.exemples.actions;
import
istia.st.avat.android.Action;
import
istia.st.avat.core.IBoss;
public
class
Action_01 extends
Action {
@
Override
public
void
doWork
(
Object... params) {
boss.notifyEvent
(
this
, IBoss.WORK_TERMINATED, params);
}
@
Override
public
void
notifyEndOfTasks
(
) {
}
}
ligne 11 : les paramètres reçus sont immédiatement renvoyés à la vue dans la notification [WORK_TERMINATED].
VII-F. La vue [Vue_01]▲
La vue [Vue_01] est la suivante :
Sélectionnez 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
@
Override
public
void
notifyEndOfTasks
(
) {
(
(
MainActivity) activity).showVue
(
2
);
}
@
Override
public
void
notifyEvent
(
IWorker worker, int
eventType, Object event) {
super
.notifyEvent
(
worker, eventType, event);
if
(
eventType =
=
IBoss.WORK_TERMINATED) {
ISession session =
(
ISession) factory.getObject
(
Factory.SESSION, (
Object[]) null
);
Object[] results =
(
Object[]) event;
session.add
(
"
urlServiceRest
"
, results[0
]);
session.add
(
"
nbAleas
"
, results[1
]);
session.add
(
"
a
"
, results[2
]);
session.add
(
"
b
"
, results[3
]);
session.add
(
"
sleepTime
"
, results[4
]);
}
}
ligne 12 : la vue gère la notification [WORK_TERMINATED] ;
ligne 15 : une session est demandée à la fabrique. C'est un singleton ;
lignes 16-21 : les cinq informations renvoyées par [Action_01] sont mémorisées dans la session ;
lignes 2-5 : lorsqu'arrive la notification [endOfTasks], la vue [Vue_02] est affichée. On rappelle que l'activité Android est injectée dans chacune des vues par la fabrique dans le champ activity .
VII-G. La vue [Vue_02]▲
La vue [Vue_02] est la suivante :
Sélectionnez 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80.
package
istia.st.avat.exemples.vues;
...
public
class
Vue_02 extends
Vue {
private
Button btnRetour;
private
TextView edtNbAleas;
private
TextView edtA;
private
TextView edtB;
private
TextView edtUrlServiceRest;
private
TextView edtSleepTime;
private
int
nbAleas;
private
int
a;
private
int
b;
private
String urlServiceRest;
private
int
sleepTime;
@
Override
public
View onCreateView
(
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return
inflater.inflate
(
R.layout.vue_02, container, false
);
}
@
Override
public
void
onActivityCreated
(
Bundle savedInstanceState) {
super
.onActivityCreated
(
savedInstanceState);
edtUrlServiceRest =
(
TextView) activity.findViewById
(
R.id.edt_urlServiceRest);
edtNbAleas =
(
TextView) activity.findViewById
(
R.id.edt_nbaleas);
edtA =
(
TextView) activity.findViewById
(
R.id.edt_a);
edtB =
(
TextView) activity.findViewById
(
R.id.edt_b);
edtSleepTime =
(
TextView) activity.findViewById
(
R.id.edt_sleepTime);
btnRetour =
(
Button) activity.findViewById
(
R.id.btn_Retour);
btnRetour.setOnClickListener
(
new
OnClickListener
(
) {
@
Override
public
void
onClick
(
View arg0) {
doRetour
(
);
}
}
);
}
@
Override
public
void
onResume
(
) {
super
.onResume
(
);
ISession session =
(
ISession) factory.getObject
(
Factory.SESSION, (
Object[]) null
);
urlServiceRest =
(
String) session.get
(
"
urlServiceRest
"
);
nbAleas =
(
Integer) session.get
(
"
nbAleas
"
);
a =
(
Integer) session.get
(
"
a
"
);
b =
(
Integer) session.get
(
"
b
"
);
sleepTime =
(
Integer) session.get
(
"
sleepTime
"
);
edtUrlServiceRest.setText
(
urlServiceRest);
edtNbAleas.setText
(
String.valueOf
(
nbAleas));
edtA.setText
(
String.valueOf
(
a));
edtB.setText
(
String.valueOf
(
b));
edtSleepTime.setText
(
String.valueOf
(
sleepTime));
}
protected
void
doRetour
(
) {
(
(
MainActivity) activity).showVue
(
1
);
}
@
Override
public
void
notifyEndOfTasks
(
) {
}
}
ligne 52 : tout se passe dans la méthode [onResume] exécutée juste avant que l'interface ne devienne visible ;
ligne 57 : on récupère le singleton [ISession] auprès de la fabrique ;
lignes 58-62 : on y récupère les cinq informations que la vue [Vue_01] y a placées ;
lignes 64-68 : elles sont ensuite affichées sur la page ;
ligne 71 : la méthode exécutée sur un clic sur le bouton [Retour] ;
ligne 73 : on affiche la vue [Vue_01].
VII-H. La fabrique▲
La fabrique instancie une nouvelle vue ainsi que la session :
Sélectionnez 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99.
package
istia.st.avat.exemples.activity;
...
public
class
Factory implements
IFactory {
public
static
final
int
CONFIG =
-
1
;
public
static
final
int
ACTION_01 =
3
;
public
static
final
int
VUE_01 =
4
;
public
static
final
int
VUE_02 =
5
;
public
static
final
int
SESSION =
10
;
private
Config config;
private
boolean
verbose;
private
Vue_01 vue_01;
private
Vue_02 vue_02;
private
Activity activity;
private
Session session;
public
Factory
(
Activity activity, Config config) {
this
.activity =
activity;
this
.config =
config;
verbose =
config.isVerbose
(
);
session =
new
Session
(
);
}
@
Override
public
Object getObject
(
int
id, Object... params) {
switch
(
id) {
case
CONFIG:
return
config;
case
SESSION:
return
session;
case
ACTION_01:
return
getAction_01
(
params);
case
VUE_01:
return
getVue_01
(
params);
case
VUE_02:
return
getVue_02
(
params);
}
return
null
;
}
private
void
init
(
Vue vue, Object... params) {
vue.setFactory
(
this
);
ITeam team =
new
Team
(
);
team.setMonitor
(
vue);
vue.setTeam
(
team);
vue.setActivity
(
activity);
vue.setVerbose
(
verbose);
vue.setBossId
(
(
String) params[1
]);
}
private
Object getVue_02
(
Object[] params) {
if
(
vue_02 =
=
null
) {
vue_02 =
new
Vue_02
(
);
init
(
vue_02, params);
}
return
vue_02;
}
private
Object getVue_01
(
Object... params) {
if
(
vue_01 =
=
null
) {
vue_01 =
new
Vue_01
(
);
init
(
vue_01, params);
}
return
vue_01;
}
....
}
Les sources présentées sur cette page sont libres de droits
et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ©
2013 Serge Tahé. Aucune reproduction, même partielle, ne peut être
faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc.
sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à
trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.