Archives de catégorie : Java

For-each ou for Iterator ?

Publié dans Java | Laisser un commentaire

En Java (comme dans plusieurs langages), il existe plusieurs manières de parcourir une liste d’éléments. Mais entre une boucle for classique, une boucle Iterator et un for-each, il existe quelques différences qu’il est de bon ton de connaître.

ilustration d'une boucle for

Continuer la lecture

Subtilité sur les classes abstraites Java

Publié dans Java | Laisser un commentaire

J’ai découvert une petite subtilité dans l’utilisation des classes abstraites aujourd’hui. Imaginons une interface Java qui est partiellement implémentée par une classe abstraite. Cette classe abstraite est assez naturellement étendue par une bonne vieille classe Java (la version française du POJO ;p). Jusqu’ici tout va bien.

Exemple 1 : héritage Java

Exemple 1 : héritage Java

Maintenant, imaginons que les méthodes implémentées dans notre classe abstraite, utilisent des méthodes implémentées seulement dans notre POJO. C’est là qu’est la subtilité (que j’annonce subtilement).
Continuer la lecture

Installer et Configurer Eclipse

Publié dans Java | Laisser un commentaire

Avant, je préférais avoir un seul Eclipse avec tous les plugins qui vont bien pour mes différents projets (Java, PHP, Android) et je jouais avec les workspace quand il fallait passer d’un projet à un autre. Aujourd’hui, j’ai l’impression qu’il vaut mieux avoir des Eclipses séparés selon l’utilisation :

  • Un optimisé pour les projets PHP,
  • Un autre pour les projets Java, OSGi
  • Et un autre pour Android. Même si pour ces deux derniers, j’aurai plutôt tendance à les mettre ensemble, à voir…

Du coup, j’ai une petite procédure d’installation / configuration et optimisation de mon IDE. La voici en résumé.
Continuer la lecture

Service Android et TabActivity

Publié dans Java | Laisser un commentaire

Lors de l’utilisation conjointe d’une TabActivity sur Android, et d’un service Android dans l’une ou l’autre des Activity, il faut faire attention à la manière dont on se connecte / déconnecte au(x) service(s) !
Il n’est pas rare d’obtenir une erreur du style :

WARN/ActivityManager(784): Binding with unknown activity: android.os.BinderProxy@6545646

La solution consiste à utiliser :

getApplicationContext().bindService(...);
// et 
getApplicationContext().unbindService(...);

plutôt que :

bindService(...);
// et 
unbindService(...);

Ce serait dû à un bug du SDK Android. Mais personnellement, cela me semble assez logique qu’il y ait à faire attention à qui (l’Activity parente, ou bien les Activity des onglets) « bind » et « unbind » les services puisque l’on a plusieurs Activity en même temps.

Personnellement, chez moi, ça rendait mes Activity quasiment inopérante : impossible de cliquer sur des boutons, d’accéder aux services, bref, la galère !

Plus d’informations

Activer le clavier physique sur un émulateur Android

Publié dans Java | Laisser un commentaire

Il me semble que dans les versions précédentes cela fonctionnait, mais toujours est-il qu’avec les derniers émulateurs Android, il n’est plus possible d’utiliser le clavier physique de mon ordinateur pour taper un texte sur l’émulateur !
Heureusement, ce n’est qu’une petite configuration à modifier 🙂

  • Dans Eclipse, aller dans l’AVD Manager
  • Sélectionner un AVD existant ou en créer un nouveau
  • Aller dans la section « Hardware » et cliquer sur « New »
  • Sélectionner la propriété « Keyboard Support » et changer sa valeur à « yes » (elle est à « no » par défaut)
  • L’émulateur est prêt à être redémarrer !

Continuer la lecture

Problèmes de mémoire ?

Java, memory leak et les erreurs de PermGen space

Publié dans Java | Laisser un commentaire

Trois articles (du même auteur) très intéressants sur les fuites mémoires en Java. A lire absolument, à tête reposée !

Base de données SQLite en ligne de commande sur Android

Publié dans Java | Laisser un commentaire

Imaginons que vous ayez un émulateur d’Android qui tourne actuellement sur votre machine, avec votre application en cours de développement, et que vous aimeriez voir ce qui se passe dans la base de données SQLite de votre application. Rien de plus simple grâce à quelques commandes SQLite.
Tout d’abord, il faut ouvrir votre shell favori (Sur Windows : Menu démarrer > Accessoires > Invite de commandes). Puis utilisez la commande suivante :

monShell>adb -e shell
#sqlite3 /data/data/android.societies/databases/societies.db
...
Ouverture SQLite
...
sqlite>... mes commandes SQLite ...

L’option -e signifie « l’émulateur actuellement ouvert. Donc si vous en avez plusieurs, ou si c’est un vrai téléphone qui est connecté à votre ordinateur : allez lire la doc pour voir comment faire. Comme ça, je dirais : adb devices pour avoir l’id des émulateurs et des téléphones en route. Puis adb -s [id séléctionné] shell. Après le comportement du shell peut varier sur un téléphone.

Quelques commandes SQLite utiles

  • .help: pour connaître la liste des commandes utiles !
  • .databases: listes des bases de données
  • .tables: liste les tables d’une base de données

Et bien sûr, toutes les commandes SQL de votre choix :

SELECT * FROM _table
DELETE FROM _table
REINDEX _table

Plus d’information

StringBuilder vs StringBuffer vs String.concat – done right | kaioa.com

Publié dans Java | Laisser un commentaire

D’après cet article StringBuilder vs StringBuffer vs String.concat – done right | kaioa.com (en anglais), il est plus avantageux en terme de performance d’utiliser StringBuilder à partir de Java 1.5 (ou StringBuffer pour les versions antérieures) que de concaténer des chaînes de caractères à coups de concat. Les chiffres sont assez parlant !

Each time you append something via ‘+’ (String.concat()) a new String is created, the old stuff is copied, the new stuff is appended, and the old String is thrown away. The bigger the String gets the longer it takes – there is more to copy and more garbage is produced.

Ce que l’on pourrait traduire par :

A chaque fois que l’on concatène à l’aide de String.concat(), une nouvelle instance de String est créée, l’ancienne étant copiée, accolée à la nouvelle, puis jetée. Plus longue est la chaîne de caractères et plus longtemps cela prendra. Donc plus on concatène, plus on créé du déchet.

De plus, le compilateur Java va transformer tout seul les concaténations manuelles avec des « + » ou des « line breaks » en utilisant des StringBuillder::append. Donc on peut utiliser sans problèmes cette écriture ! C’est de loin la plus lisible pour de petites chaînes de caractères. Quant aux autres : StringBuilder à la rescousse !

Voilà qui est bon à savoir 🙂

Pour aller un peu plus loin avec StringBuiler

Erreur Maven 3 « Could not find Launcher »

Publié dans Java | Laisser un commentaire

Lorsque vous lancez une commande Maven (par exemple « mvn install ») et que vous obtenez l’erreur suivante :

Could not find the main class: org.codehaus.plexus.classworlds.launcher.Launcher

ou en français :

Erreur : impossible de trouver ou charger la classe principale org.codehaus.plexus.classworlds.launcher.Launcher

Pas de panique ! La solution la plus probable est que vous utilisez une configuration de Maven 2 pour utiliser Maven 3.
Avec Maven 3, il faut enlever le variable d’environnement M2_HOME : et normalement ça marche ! Si besoin, il est possible d’utiliser M3_HOME pour préciser l’emplacement pour déployer / récupérer les dépendances (dossier « repository ») et où placer le fichier de configuration utilisateur « settings.xml ».

Une boucle propre sur un Cursor en Java

Publié dans Java | Laisser un commentaire

Plusieurs solutions s’offrent à nous pour effectuer une boucle sur un objet Cursor en Java.

La plus sérieuse

Cursor c = ......;
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
	// Do something
}
c.close();

Mieux, efficace et fun !

Cursor c = ......;
c.moveToFirst();
do {
// Do something
} while (c.moveToNext());
c.close();