Bonjour !
Depuis le sdk 14 ,ma libraire pour des raison de stabilité m'a plus accès au réseau je dois faire mes requête dans un autre thread ,soit je dois tout recorder ma libraire ... je suis pas sortie de l'auberge ,ou alors je pensai utilisé le libraire "THREAD"
Bonjour !
Depuis le sdk 14 ,ma libraire pour des raison de stabilité m'a plus accès au réseau je dois faire mes requête dans un autre thread ,soit je dois tout recorder ma libraire ... je suis pas sortie de l'auberge ,ou alors je pensai utilisé le libraire "THREAD"
Je déconseille cette bibliothèque car elle n'utilise pas la boucle de messages de B4A (en cherchant dans les forums, on doit pouvoir retrouver le message d'Erel qui le confirme et où il dit qu'elle devrait être réécrite). Autre défaut: sa gestion des priorités est ... fantaisiste? (ce défaut n'est pas dû à son auteur mais aux routines d'Android auxquelles il fait appel). Il faut coder sa propre bibliothèque pour soumettre des runnables à la boucle de messages. Voici un exemple:
B4X:
Runnable r = new Runnable() {
@Override
public void run() {
try {
.... ton code .....
.... suivi d'un raiseEvent pour renvoyer un resultat a ton programme
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
};
BA.submitRunnable(r, null, 0);
Je ne saisis pas l'intérêt de faire ça alors que je t'ai montré un exemple de runnable pour interagir proprement avec B4A. Laisse tomber les threads, les asynctasks et autres, sauf si tu as un besoin vraiment spécifique. Si tu lis des blogs de développeurs (avancés) en Java, tu verras que l'utilisation d'un handler+looper est préférée à toutes les autres méthodes. C'est celle que préconise Cyril Mottier par exemple (auteur de GreenDroid, de Prixing et d'un bouquin sur le développement pour Android). Et c'est ce qu'on trouve dans B4A. Donc...
Je t'avoue que j'ai galéré quelques temps avec la bibliothèque Thread avant de découvrir la bonne méthode. Et maintenant que du bonheur ! Je fous de l'asynchrone partout ! Je distribue d'ailleurs gratuitement à tous mes clients une bibliothèque qui permet de le faire simplement.
Pour changer la priorité d'un processus:
B4X:
int myTID = android.os.Process.myTid();
android.os.Process.setThreadPriority(myTID, Priority);
Bonjour,est ce que tu pourrai m'expliquer avec ton exemple comment convertir une de mes fonction "clasique" en fonction asynchone car j'ai du mal a comprendre la maniere de faire cela
B4X:
Runnable r = new Runnable() {
@Override
public void run() {
try {
.... ton code .....
.... suivi d'un raiseEvent pour renvoyer un resultat a ton programme
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
};
BA.submitRunnable(r, null, 0);
par exemple avec cette petite fonction qui me converti un hexa et decimal
public class my_lib
{
...
public int HexadecimalToDecimal(String hex ){
String str= hex;
int i= Integer.parseInt(str,16);
return i;
}
..
}
merci d'avance pour ton aide
un sujet "générique" sur ce thème serai le bien venu je pense
Tu mets le code que je t'ai donné dans une fonction, tu remplaces "... ton code ..." par ce que tu veux et tu appelles la fonction. Difficile de faire plus simple. Pour récupérer le résultat, il faut utiliser la fonction ba.raiseEvent.
ok
quelle est la syntaxe pour le ba.raiseevent dans mon cas ?
c'est la première fois que j'utilise cette fonction je ne la connais pas ,et dans les exemple sur le forum ,je ne pige pas ou l'on va chercher les paramètre a inclure entre les parenthèses
dons si j'ai bien compris c'est comme cela que je dois coder ma fonction
B4X:
public int HexadecimalToDecimal(String hex ){
Runnable r = new Runnable() {
@Override
public void run() {
try {
String str= hex;
int i= Integer.parseInt(str,16);
//.... suivi d'un raiseEvent pour renvoyer un resultat a ton programme
ba.raseevent(HexadecimalToDecimal.this, ????,?????,????);
return i; }
catch (Exception e) {
throw new RuntimeException(e);
}
}
};
BA.submitRunnable(r, null, 0);
}
Il manque "BA ba" comme premier paramètre de la fonction HexadecimalToDecimal (le paramètre est automatiquement passé par B4A, donc tu ne t'en soucies pas).
Pour raiseEvent, le tooltip dans Eclipse devrait te donner le nom et le type de chaque paramètre. Dans le premier param, tu peux mettre Null, dans le deuxième, tu mets le nom de la sub (en minuscules) qui doit récupérer les valeurs, et en dernier tu mets les valeurs à transmettre à ta sub (c'est un tableau d'objets donc à passer avec new Object[] {...}).