2010-11-13 27 views
1

Je fais une application qui utilisera à la fois les touches et les sensorévents. Le problème avec les touchesvents est qu'elles se déclenchent très souvent, et consomment ainsi des quantités massives de temps CPU. La solution courante consiste à faire un Thread.sleep pour le refroidir. Toutefois, si vous souhaitez utiliser à la fois l'onTouchEvent et l'onSensorChanged dans la même activité, l'application du hachage Thread.sleep ralentira également onSensorChanged. Ceci est évidemment dû au fait que les deux méthodes sont appelées depuis le même thread (ui).Dormir dans onTouchEvent bloque onSensorChanged

Existe-t-il un moyen d'appeler onTouchEvent à partir d'un thread différent de celui de l'interface utilisateur, de sorte que l'on puisse faire l'astuce Thread.sleep sans ralentir onSensorChanged?

Répondre

0

"La solution courante consiste à faire un Thread.sleep pour le refroidir."

Où avez-vous entendu cela? Dormir sur le thread principal (également appelé EDT - Event dispatching thread) n'est pas acceptable. Android redessine l'écran et effectue toutes sortes de tâches sur ce fil. Dormir peut le rendre insensible et est à mon humble avis une mauvaise pratique. Si onTouchEvent() déclenche trop souvent, il suffit de les filtrer dans votre code = ne faites rien si au moins X fois le temps ne s'est pas écoulé depuis le dernier événement.

long lastTime = 0; // field in you class holding event handler 

// inside your onTouchEvent handler 
if(System.getCurrentTimeMillis() - lastTime < XXX) 
    return; 
lastTime = System.getCurrentTimeMillis(); 
+1

Merci, mais il semble que ce n'est pas ce qui se passe à l'intérieur d'onTouchEvent qui le ralentit, mais plutôt qu'il est appelé du tout. Même avec un onTouchEvent vide, il y a des décalages visibles sur onSensorChanged. – MrJohs

+0

Malheureusement, on ne peut pas contrôler combien d'événements Android se déclenche. –