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.