Tag Archives

5 Articles
AsyncTasks s’attendants

AsyncTasks s’attendants

Difficile de trouver un nom adéquat pour cet article.

En fait, je vais vous donner un conseil utile pour exécuter deux AsyncTasks en parallèle et qu’elles s’attendent pour continuer. Si vous ne le savez pas, les AsyncTasks sont des classes d’exécution de code en arrière-plan. Elles sont utilisées sur Android pour récupérer des données du WEB, faire des calculs, … et tout ça, sans gêner le Thread d’affichage.

De plus, vous pouvez effectuer des traitements sur le Thread d’affichage juste avant et juste après le traitement asynchrone très simplement. D’ailleurs la documentation Android privilégie l’utilisation des AsyncTasks en lieu et place des Threads.

Bon, revenons à nos moutons. Exécuter deux AsyncTasks en parallèle et attendre que les deux se terminent pour effectuer le traitement final. En fait, nous  allons lancer la seconde AsyncTasks dans le PreExecute() de la première et effectuer le traitement final dans le PostExecute de la première aussi. Nous attendrons que la seconde finisse dans le traitement asynchrone de la première afin d’éviter tout gel du Thread d’affichage.

Si vous m’avez suivi, voici le squelette java que nous devrions avoir :

private TaskA taskA;
private TaskB taskB;

class TaskA extends AsyncTask<Void, Void, Void>{

   @Override
   protected void onPreExecute(){
       // Ici, on lance notre seconde Task
       taskB = new TaskB();
       taskB.execute();
   }

   @Override
   protected Void doInBackground(Void... params){
       // Traitements asynchrones de la Task A
       // ...
       // Fin des traitements de la Task A

       // On attends le résultat de B
       try{
           taskB.get();
       } catch(ExecutionException e) {
           e.printStackTrace();
       } catch(InterruptedException e) {
           e.printStackTrace();
       }

       return null;
   }

   @Override
   protected void onPostExecute(Void result){
       // Le traitement final
       // Ici, vous êtes dans l'UI Thread
   }
}

class TaskB extends AsyncTask<Void, Void, Void>{

   @Override
   protected Void doInBackground(Void... params){
       // Traitements asynchrones de la Task B
       // ...
       // Fin des traitements de la Task B

       return null;
   }
}

La partie qui permet d’attendre que l’autre asynctask finisse est juste la fonction get() des AsyncTask. Elle évite de passer par les Threads et de faire le couple wait()/notify().

De plus elle lève certaines exceptions si jamais la tâche que vous attendez a été annulée ou a eu une erreur d’exécution entre autre. Et pour exécuter ces deux tâches vous avez juste à appeler cette ligne dans votre code :

taskA = new TaskA();
taskA.execute();

Bien entendu, vous pouvez étendre ce cas pour en effectuer X en parallèle. Je pense avoir fini ma partie conseil pour les AsyncTasks. Si vous avez des questions, suggestions, corrections, n’hésitez surtout pas à poster un commentaire pour que j’y réponde.

Teinter parallèlement la même ressource
Notre image drapeau

Teinter parallèlement la même ressource

by Throrïn 0 Comments

Il est difficile de donner un titre court à ce que je vais expliquer aujourd’hui. A côté de ça, l’explication sera courte car très simple. Donc, pour en revenir à nos moutons, nous allons voir comment afficher sur le même écran deux fois la même ressource teinté d’une manière différente comme le montre l’image ci dessous.

Notre image drapeau

De base, lorsque l’on charge une ressource, même si c’est plusieurs fois dans différentes variables, Android répercuter les changements faits sur toutes les variables pointant sur cette ressource. Mais heureusement, il existe une fonction à appeler permettant de bloquer cette répercussion. Il suffit de rendre muette votre ressource. Dans les lignes suivantes, nous allons voir comment :

//chargement de nos ressources
Drawable flagGreen  = getResources().getDrawable(R.drawable.ic_menu_slide_flag);
Drawable flagRed = getResources().getDrawable(R.drawable.ic_menu_slide_flag);

//maintenant, on les rend muettes pour ne pas répercuter 
//les changements aux autres appeles de cette ressource
flagGreen.mutate();
flagRed.mutate();

La fonction permettant ceci est la fonction mutate(). Voici ce que dit la documentation à propos de cette fonction :

Make this drawable mutable. This operation cannot be reversed. A mutable drawable is guaranteed to not share its state with any other drawable. This is especially useful when you need to modify properties of drawables loaded from resources. By default, all drawables instances loaded from the same resource share a common state; if you modify the state of one instance, all the other instances will receive the same modification. Calling this method on a mutable Drawable will have no effect.

Returns
  • This drawable.

Maintenant que « nos ressources » sont dissociées l’une de l’autre, nous allons pouvoir leur appliquer un filtre de couleur. Le filtre est appliquable sur les Drawables grâce à la fonction setColorFilter() :

flagGreen.setColorFilter(Color.parseColor("#52D052"), Mode.MULTIPLY);
flagRed.setColorFilter(Color.parseColor("#D11717"), Mode.MULTIPLY);

Pour effectuer un effet différent de filtre, on peut faire comme pour les calques sous Photoshop ou Paint.net, on sélectionne un « mode de calque ». Ici j’ai opté pour un mode de multiplication pour obtenir le résultat souhaité. Maintenant vous pouvez peindre vos Drawables dans des Canvas, les afficher dans une ImageView, ils apparaîtrons comme la capture de début de l’article. Si vous oubliez d’appeler la fonction mutate() sur vos Drawable, ils s’afficheront avec le dernier filtre appliqué (ici tous en rouge).

Gestion des différents écrans de même densité

Gestion des différents écrans de même densité

by Throrïn 1 Comment

Si vous vous êtes essayés au développement Android, vous avez pu constater que son plus gros défaut, c’est les différentes résolutions d’écran (et les Roms constructeurs/opérateurs). Dans la plupart des cas, on peut se débrouiller avec les différents dossiers de ressource de base comme ceci :

  • ldpi (ex : HTC tatoo)
  • mdpi (ex : Samsung Galaxy Spica)
  • hdpi (ex : Nexus One/S)
  • xhdpi  (ex : Asus EEEPad Transformers)

Le souci, c’est que certaines de ces densitées peuvent être utilisées par des résolutions utilisant un ratio différent. Par exemple, le Nexus One et le Motorola Milestone ont chacun une densité HDPI mais l’un a une résolution de 480×800 (ou WVGA800) et l’autre une résolution de 480×854 (ou WVGA854).

Si vous utilisez une ressource de taille fixe (comme une image de SplashScreen) vous vous retrouverez avec une bande noire sur les écrans WVGA854. Nous allons donc voir comment renseigner à Android que nous allons chercher le même fichier (même nom) mais uniquement pour l’un ou l’autre des écrans.

Pour ce faire, nous allons créer deux machines virtuelles Android différentes. L’une utilisant un écran en WVGA800 avec une densité de 240dp et l’autre avec un écran WVGA854 d’une même densité que la précédente.

notre émulateur milestone

notre émulateur nexus One

Maintenant nous allons créer un projet Android de base avec comme layout main.xml le suivant :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/splash" />

</LinearLayout>

Et voici l’image splash.png utilisée dans notre ImageView. Elle est à placer dans /res/drawable-hdpi :

[]1

Splash pour le N1

Pour bien voir sa contenance sur l’écran, nous allons mettre notre application en fullScreen tout en désactivant la barre de titre (la barre grise moche qui dit le nom de l’application). Rajoutez ces lignes suivantes dans la méthode onCreate de votre application juste avant l’appel à setContentView():

requestWindowFeature(Window.FEATURE_NO_TITLE);  
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

Maintenant lancez l’application sur les deux émulateurs afin de voir le rendu sur chacun :

Résultat sur le WVGA800

Résultat sur le WVGA854

Comme vous pouvez le voir, nous nous retrouvons avec une bande noire apparaissant sur notre émulateur WVGA854. Nous allons donc rajouter le répertoire suivant : drawable-port-hdpi-854×480. Si on le décompose cela donne :

  • drawable            : type de ressource
  • port                : orientation (land pour paysage, port pour portrait)
  • hdpi                : densité de l’écran
  • 854×480             : résolution de l’écran

Nous allons donc pouvoir rajouter le splash suivant dans ce dossier afin d’avoir le bon rendu sur chacun des émulateurs. N’oubliez pas de le nommer de la même façon que l’autre splash à savoir splash.png.

[]2

notre nouveau splash pour WVGA854

Et voilà le résultat :

Résultat final sur le WVGA800

Résultat final sur le WVGA854

Maintenant avec ceci vous savez utiliser les ressources pour toutes les résolutions existantes et à venir sur Android. Mais rassurez-vous, la plupart du temps les répertoires citées au début de l’article suffisent amplement pour couvrir l’ensemble du parc. Source :

http://developer.android.com/guide/practices/screens_support.html 

Paste QR

Paste QR

by Throrïn 1 Comment

Cela fait maintenant quelques semaines que je développe ma première application Android (hors boulot) et je viens de la terminer (quand je dis terminer c’est avec la partie graphique du market + présentation, …).

Je vous présente donc l’application pasteQR.

 

Présentation?

Vous souhaitez avoir un presse-papier communiquant simplement et sans consommer votre forfait data ? Ou bien vous voulez partager du texte avec quelqu’un d’autre se trouvant à côté de vous mais vous n’avez pas la dernière technologie sans contact ou NFC ?

Alors PasteQR est l’application qu’il vous faut. Elle permet de partager, copier et coller du texter entre vos différents smartphones et tablettes.

L’application est compatible à partir d’Android 2.1 et jusqu’à la dernière disponible à savoir la 4.0 (aka Ice Cream Sandwich). Et elle nécessite un appareil photo pour fonctionner convenablement.

Pour copier/coller/partager vos textes simplements, nous utilisons les QRCodes ce qui permet de passer outre le wifi, Bluetooth ou autre réseau mobile.

Comment s’utilise t’elle ?

PasteQR est très simple d’utilisation. Quand vous rentrez dedans deux choix s’offrent à vous : Copier et Coller.

Copier sert à générer un QRCode que votre ami scannera quand à coller il servira à scanner le QRCode et à rajouter son contenu au presse-papier.

Et quels sont les terminaux compatibles ?

Pour faire fonctionner PasteQR, Vous aurez juste besoin d’avoir un smatphone compatible Android 2.1 et supérieur avec un appareil photo. L’application est compatible tablette mais non optimisée pour (une version verra le jour plus tard) et aussi compatible avec la toute dernière en date, à savoir Android Ice Cream Sandwich.

Où la trouve t’on ?

Vous pourrez trouver l’application sur l’android market, elle est gratuite et ne nécessite rien d’autre de particulier.


Android app on Google Play

Si vous avez des retours particuliers à faire sur l’application, ou certaines améliorations à vouloir voir arriver, merci de me le dire dans les commentaires. Idem pour tout bug survenant en cours d’utilisation.

Développement Android sous Netbean

Développement Android sous Netbean

by Throrïn 3 Comments

Pour mes tutos de la rentrée, je vais commencer simplement avec le passage à un nouvel IDE : Netbean. Comme Eclipse, Netbean est un IDE codé en Java, permettant de développer sous différents langages (PHP, C/C++, Java, …), et pouvant être enrichi grâce à des extensions (intégration Subversion, …).

Aujourd’hui nous allons voir comment développer sous Android avec Netbean. Comme certains le savent, Google fournit une extension Android que pour Eclipse et, malheureusement, elle a tendance à planter sous Eclipse Helios (dernière version).

Heureusement pour nous, un plugin non officiel, mais fonctionnel, a été fait pour Netbean et, je dois bien l’avouer, il semble être assez bien réussit.

Je ne l’ai pas testé dans sa globalité mais il me semble correct. Après à vous de voir. Mais, avant de commencer, vous devrez télécharger Netbean. Je vous conseille de prendre la version contenant les différents langages ainsi que les serveurs glassfish et Apache tomcat.

Dans l’ensemble Netbean fonctionne comme Eclipse, autocompletion, ajout de library java/PHP, … mais, et c’est là son point fort, il s’avère être beaucoup plus léger et rapide. Ensuite, n’oubliez pas de vous procurer le SDK Android, d’installer les différentes versions disponibles, et de créer une machine virtuelle Android.

Bien, maintenant que tout cela est en place, nous allons nous attarder à l’installation du plugin. Pour se faire, nous allons enregistrer un nouveau dépôt dans Netbean. Pour se faire, il suffit d’aller dans Outils -> Plugins. Si vous n’avez que plugins et Options, profitez-en pour activer les plugins PHP et Java SE (figure 1).

Ensuite, allez dans le dernier onglet () et choisissez d’ajouter un dépôt. Là, entrez l’adresse suivante, puis validez (figure 2) :
http://kenai.com/projects/nbandroid/downloads/download/updatecenter/updates.xml

Maintenant, il ne vous reste plus qu’à installer le plugin. Pour se faire, allez dans l’onglet Plug-ins disponibles et sélectionnez Android puis installez (figure 3).

Bien, il ne nous reste plus qu’à ajouter les différentes ressources Java d’Android dans Netbean et le tour est joué. Pour se faire, nous allons aller dans Outils -> Java Platforms -> ajouter une plateforme. Puis sélectionnez Google Android Handheld Platform (figure 4).

Pour finir, pointez le SDK et sélectionnez la version à ajouter. Personnellement, j’enregistre chaque version d’Android (figure 5).

Voilà. Maintenant il ne vous reste plus qu’à créer un projet Android. Vous pourrez constater que l’arborescence diffère d’Eclipse (figure 6). Pour lancer votre application, il vous suffit juste d’appuyer sur la touche F6 et une machine virtuelle Android se lance (figure 7).

Maintenant vous pouvez développer convenablement sous Netbean. Je n’ai malheureusement pas eu le temps de tester le debuggeur. Si vous avez un problème, n’hésitez pas à demander.