Je suis curieux de la sécurité de cette méthode que j'ai envisagé d'utiliser pour passer des événements tactiles dans mon application Android (et tester ma compréhension de la concurrence en Java). Voici les bases:Une référence volatile est-elle un moyen sûr de passer des MotionEvents entre threads?
J'ai un SurfaceView branché à SurfaceHolder.Callback pour obtenir des événements d'entrée utilisateur, principalement le rappel onTouchEvent
. Après que la méthode onTouchEvent
est invoquée, je vois si event.getAction() == MotionEvent.ACTION_UP
et, si c'est le cas, appelle une méthode que j'ai nommée postTouchEvent
qui est une méthode membre de mon thread d'application qui met à jour l'état de l'application et dessine dans le canevas.
SurfaceView
@Override
public boolean onTouchEvent(final MotionEvent event)
{
mAppThread.postTouchEvent(event);
}
AppThread
private volatile MotionEvent mInputEvent;
public void postTouchEvent(final MotionEvent event)
{
this.mInputEvent = event;
}
@Override
public void run()
{
// while loop ...
if (this.mInputEvent != null)
{
final MotionEvent inputEvent = this.mInputEvent;
this.mInputEvent == null;
// update state based on inputEvent (not this.mInputEvent)
}
// draw to canvas
}
Maintenant, je comprends qu'il est certainement pas atomique, mais puisque je traite comme immuable après l'avoir reçu du cadre, ne ce travail? (Au lieu de synchroniser la méthode post et l'instruction if, que je n'ai aucun problème à faire, mais je demande à apprendre.)
Voici mes pensées. Je sais que je vais avoir une référence valide à l'objet mais je ne sais pas dans quel état je verrai réellement l'objet. Tout en testant tout fonctionne très bien mais je suis conscient de la façon dont les exceptions de threading peu communes peuvent être, même si quelque chose est cassé.
Aussi, je peux voir un problème avec ceci: Si un autre MotionEvent vient cependant, il est possible que inputEvent dans la méthode run()
sera mis à un événement différent de celui qui a été référencé lors this.mInputEvent != null
a été vérifiée, mais vraiment ISN pas un problème.
Alors, y a-t-il quelque chose qui me manque ou, à mes fins, cela devrait-il être acceptable?
C'est exactement ce que je cherchais à apprendre. Merci d'avoir pris le temps de fournir une réponse détaillée et une solution suggérée. – Guzba
Vous êtes les bienvenus! :) – adamp
Sauvé ma vie :) – Gilian