la mise en œuvre de antirebond en Java
Pour certains code que j'ai écris que je pouvais utiliser une agréable mise en œuvre générale de debounce
en Java.
public interface Callback {
public void call(Object arg);
}
class Debouncer implements Callback {
public Debouncer(Callback c, int interval) { ... }
public void call(Object arg) {
//should forward calls with the same arguments to the callback c
//but batch multiple calls inside `interval` to a single one
}
}
Quand call()
est appelée plusieurs fois dans interval
millisecondes avec le même argument à la fonction de callback doit être appelé qu'une seule fois.
Une visualisation:
Debouncer#call xxx x xxxxxxx xxxxxxxxxxxxxxx
Callback#call x x x (interval is 2)
- N' (quelque chose comme) cela existe déjà dans certaines Java standard de la bibliothèque?
- Comment voulez-vous mettre en œuvre que?
- ressemble à java.util.la simultanéité fournit les blocs de construction
- Je sais que c'est une vieille question, mais j'ai posté une question similaire il y a quelques mois ici: stackoverflow.com/questions/18723112/... et a fourni une réutilisables mise en œuvre sur GitHub qui pourrait être d'intérêt
Vous devez vous connecter pour publier un commentaire.
Veuillez considérer ce qui suit thread-safe solution. Notez que la serrure de la granularité est sur le niveau principal, de sorte que seuls les appels sur la même touche de bloquer les uns les autres. Il gère également le cas d'une date d'expiration sur la touche K, qui se produit pendant l'appel(K) est appelée.
Voici mon oeuvre:
Exemple d'utilisation:
Je ne sais pas si cela existe mais il doit être simple à mettre en œuvre.
Bien entendu, cet exemple simplifie outre mesure un peu, mais c'est plus ou moins tout ce que vous devez. Si vous souhaitez conserver à l'écart délais d'attente pour les différents arguments, vous aurez besoin d'un
Map<Object,long>
au lieu de seulement unlong
de garder une trace de la dernière moment de l'exécution.Timer
ouScheduledExecutorService
au lieu de cela, c'est beaucoup plus propre et plus sûr de cette façon.La suite de la mise en œuvre de travaux sur du Gestionnaire de threads (par exemple, les principaux thread de l'INTERFACE utilisateur, ou dans un IntentService). Il n'attend qu'à être appelé à partir du fil sur lequel il est créé, et il permet également de faire fonctionner un jeu d'action sur ce fil.
Cela ressemble à cela pourrait fonctionner:
hashCode
comme la clé, car il permettra de créer facilement des collisions. Ne pas oublier que les objets de type différent pourrez facilement avoir l'égalité des codes de hachage, même si leurs propres fonctions de hachage sont parfaits.Map<Object, Timer>
).HashMap
puis utilise le hachage de l'objet code en interne pour atteindre rapidement le seau contenant votre article (et potentiellement d'autres éléments avec le même code de hachage), mais après que le code de hachage est ignoré et il permet de comparer laObject
avec ceux que seau de trouver la correspondance. Tldr; à chaque fois que vous appelezhashCode()
dans votre code, vous êtes le plus susceptible de faire quelque chose de mal.