Aller au contenu

Posts from the ‘Java’ Category

8
oct

Passer un objet d’une Activity à une autre

Cette astuce peut s’avérer relativement utile lorsque l’objet en question est peuplé depuis une source externe comme un flux RSS, ce qui peut parfois demander un temps d’attente assez long. La méthode utilise le principe de serialization qui va tout simplement transformer nos objets ‘Serializable’ en byte[].

Pour cela, nous disposons d’une classe, à partir de laquelle, les objets que nous souhaitons sérialiser devront hériter. De la sorte, vos objets pourront être passés très simplement d’une Activity à une autre.

public class CSerializable implements Serializable {

    public byte[] serialize () throws IOException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream ();
        ObjectOutput out = new ObjectOutputStream (bos);
        out.writeObject (this);
        out.close ();
        return bos.toByteArray ();
    } // serialize ();

    public Object unserialize (byte[] b) throws IOException,
            ClassNotFoundException {
        ByteArrayInputStream bis = new ByteArrayInputStream (b);
        ObjectInputStream in = new ObjectInputStream (bis);
        Object object = in.readObject ();
        bis.close ();
        in.close ();
        return object;
    } // unserialize ();

}; // CSerializable;

Pour continuer, voici un exemple vraiment très simple d’objet devant hériter de la classe CSerializable.

public class CTest extends CSerializable {
    protected String title, content;
    protected Date date;

    public void populate (byte[] serialize)
            throws IOException, ClassNotFoundException {
        CTest object = (CTest)unserialize (serialize);
        setTitle (object.getTitle ());
        setContent (object.getContent ());
        setDate (object.getDate ());
    } // populate ();

    public String getTitle () {return title;}
    public void setTitle (String title) {this.title = title;}

    public String getContent () {return content;}
    public void setContent (String content) {this.content = content;}

    public Date getDate () {return date;}
    public void setDate (Date date) {this.date = date;}
}; // CTest;

Le passage de l’objet de l’Activity 1 vers la 2 se résumer alors à ce qui va suivre:

// CActivity1
CTest test = new CTest ();
test.setTitle ("Mon titre");
test.setContent ("Mon contenu");
test.setDate (new Date ());
Intent intent = new Intent (getApplicationContext (), CActivity2.class);
intent.putExtra ("test", test.serialize ());
startActivity (intent);
// CActivity2
byte[] testArray = getIntent ().getExtras ().getByteArray ("test");
CTest test = new CTest ();
test.populate (testArray);
3
sept

Android: Contrôler votre PC à l’aide de votre portable ou votre tablette.

Télécharger le logiciel de communication
Télécharger l’application Android

Après 3 à 4 bonnes semaines de travail (environ 40h), j’ai enfin réussi à terminer une première version de ma toute première application sous Android. Son but est de vous permettre de contrôler votre PC depuis une tablette (de préférence car mieux adaptée qu’un portable avec un petit écran). En somme, votre tablette devient votre souris et votre clavier.

Pour cela, il faut au préalable lancer un programme sur votre ordinateur (pour le moment uniquement compatible sous Windows), qui va permettre de réaliser les échanges PC <> Android. Saisir un identifiant, un mot de passe, et d’activer les communications.

Ensuite, il ne vous reste plus qu’à lancer l’application sous Android et de vous connecter au PC pour lequel nous venons juste d’activer les communications.

Au début, l’utilisation peut paraître relativement déroutante car j’ai pour le moment souhaité aller au plus simple. Lorsque vous déplacerez le pointeur depuis votre tablette, les mouvements se feront de manière proportionnelle avec la résolution de votre écran. En clair, le coin supérieur-gauche de votre tablette correspond au coin supérieur-gauche de votre écran, et pour le coté droit, c’est la même chose.

Pour le clic-gauche, il faut garder une pression sur la tablette pour le contrôle du pointeur, et en réaliser une supplémentaire pour lancer cette action. Le plus simple est d’utiliser les deux mains, une pour le contrôle du pointeur (tout comme vous le faites en gardant votre main sur la souris), et une autre pour réaliser les actions (clic-gauche / clic-droit). Le clic-droit quant à lui, est réalisé à l’aide d’une troisième pression supplémentaire.

Il est aussi possible d’utiliser le clavier, pour cela il suffit d’aller dans le menu (durant la phase de contrôle) et de l’activer. Attention, dans cette première version toutes les touches ne sont pas encore supportées. Pour l’instant vous pouvez utiliser les lettres (minuscules et non accentuées), les chiffres, ainsi que les touches espace, entrer et supprimer.

Je ne sais pas encore si je vais continuer le développement, mon objectif étant simplement d’apprendre à développer sous Android par le biais de travaux que je publierai très certainement sur mon blog.

Coté serveur (PC):
Développé avec JAVA, utilise SWT pour l’interface.

Coté client (Tablette):
Développé en JAVA, API 7 (2.1-update1) de Android.

Les communications sont réalisées en TCP pour garder les connexions ouvertes entre les clients et le serveur, et en UDP pour la phase de contrôle.

Uniquement testé depuis ma tablette ASUS EEE Pad Transformer TF101 et mon Galaxy TEOS, ça devrait normalement fonctionner quasiment partout … à voir!

27
août

Mise à jour d’une ListView depuis une AsyncTask

Le pas est fait! Je me met doucement au développement d’applications sous Android, et fort heureusement pour moi, tout se passe avec JAVA! En temps que novice en la matière, j’ai commencé (tout naturellement) par me documenter, et avant de partager ce tutoriel avec vous, je tiens à remercier http://www.tutomobile.fr/ pour ses nombreux exemples et explications qui m’ont permis de débuter sans trop me prendre la tête … tout y est! Je tiens à préciser qu’il s’agit là d’un simple retour d’expérience et qu’il existe peut-être une solution plus adaptée voire plus efficace. N’hésitez donc pas à me faire vos retours.

Une ListView va nous permettre d’ajouter des éléments en liste au moment de l’exécution de l’application, mais lorsqu’on ne connait ni le nombre ni le contenu de ces derniers, notamment lors de la récupération d’un flux RSS qu’on souhaite organiser en liste, le développement peut tenir du parcours du combattant (en moins épuisant … ouf!).

J’ai trouvé beaucoup d’exemples sur internet, mais personnellement, je ne voulais pas bloquer l’utilisateur avec une boîte de chargement, mon souhait était qu’il puisse utiliser la liste et son contenu, pendant que cette dernière continue à se remplir tranquillement.

La première étape consiste à définir nos layoutsmain.xml et listentry.xml

  • main.xml correspond au layout principal qui va définir l’organisation des éléments de notre application (ici juste une liste), et listentry.xml celui des éléments de la liste.
  • Je ne vais pas expliquer l’organisation des fichiers XML, tout simplement parce que ce n’est pas l’objet de cet article, et surtout parce que d’autres sites le font déjà très bien (cf: le lien que j’ai donné en tout début d’article).

Ensuite, il ne nous reste plus qu’à lier le tout sous JAVA, instancier correctement nos objets et lancer la récupération de notre contenu de manière totalement asynchrone. Pour cela, nous allons utiliser AsyncTask, qui a pour principale fonction de lancer un processus en tâche de fond sans pour autant bloquer le thread principal qui gère l’application. En somme, si les traitements sont longs, l’application ne sera pas bloquée.

Voici le profil de la classe que j’utilise pour mes besoins qui hérite de AsyncTask.

private class CAsyncTask extends AsyncTask<Void, Void, Void> {
    protected Void doInBackground (Void... unused);
    protected void onPostExecute (final Void unused);
} // CAsyncTask ();

doInBackground  parle d’elle-même, c’est ici que nous allons réaliser nos traitements susceptibles de prendre du temps.

onPostExecute sera automatiquement appelée lorsque la tâche aura terminée ses traitements.

Pour plus d’infos, je vous conseille d’aller jetter un petit coup d’oeil par ici : http://developer.android.com/reference/android/os/AsyncTask.html

Pour terminer il est important de noter qu’on ne peut pas modifier les éléments du thread principal sans en avoir l’autorisation, vous ne montez pas dans une voiture alors qu’elle roule à vive allure (… j’éspère), ici c’est un peu la même chose. Afin de pouvoir modifier la liste pour y ajouter des éléments, il va falloir faire appel à la méthode runOnUiThread de notre Activity qui attend en paramètre un objet de type Runnable.

activity.runOnUiThread (new Runnable () {
    public void run () {
        HashMap<String, String> map = new HashMap<String, String> ();
        map.put ("title", it);
        map.put ("description", "Pause de "+ sleep + " ms");
        listItem.add (map);
        adapter.notifyDataSetChanged ();
    } // run ();
});

Et voilà! Notre liste se met gentillement à jour sans bloquer l’utilisation de l’application avec une boite de chargement.

Télécharger les sources