2010-02-25 5 views
2

Ici je mets à jour mon monde à inclure la taille de la toileComment utiliser callbacks dans mon propre code

world.getViewPort().updateViewPortSize(width,height); 

Y at-il une meilleure façon de le faire? Est-il possible que je puisse automatiquement mettre à jour mon objet monde sans avoir à l'appeler manuellement dans la méthode setSurfaceSize mais l'appeler à partir de My world class? Je pense que je peux utiliser une sorte de rappel, mais je ne les comprends pas!

/* Callback invoked when the surface dimensions change. */ 
public void setSurfaceSize(int width, int height) { 
    // synchronized to make sure these all change atomically 
    synchronized (mSurfaceHolder) { 
     mCanvasWidth = width; 
     mCanvasHeight = height; 
     world.getViewPort().updateViewPortSize(width,height); 
    } 
} 

Répondre

4

Les fonctions de rappel sont assez simples en Java. La façon de le faire est de simplement définir une interface A qui a une seule méthode m(), puis ajouter une collection de type A à votre classe mondiale. Ensuite, à un certain point de votre objet World, vous voulez parcourir votre collection A et appeler la méthode m() sur chaque élément. Pour ajouter des "fonctions de rappel" à votre monde, vous définissez simplement une classe qui implémente votre interface A et la place dans la collection d'objets A de votre classe mondiale. Par exemple,

public interface CallbackFunction 
{ 
    public void execute(int a, int b); 
} 

public class World 
{ 
    List<CallbackFunction> callbackFunctions; 

    public void addCallback(CallbackFunction f) 
    { 
     callbackFunctions.add(f); 
    } 

    private void updateWorld() 
    { 
     // This loop could be anywhere in your World class 
     for(CallbackFunction f : callbackFunctions) 
     { 
      f.execute(<some int>, <some int>); 
     } 
    } 
} 

Ensuite, pour ajouter une fonction à votre monde:

world.addCallback(new CallbackFunction() 
{ 
    public void execute(int a, int b) 
    { 
     // Do some stuff 
    } 
} 

Je laisse le reste à vous, mais cela devrait vous donner une bonne idée de la façon dont les callbacks sont généralement mises en œuvre en Java .

Vous n'avez pas non plus besoin de stocker une collection générale de fonctions de rappel, vous pouvez avoir des fonctions de rappel spécifiques couplées à des méthodes particulières dans votre classe World. Par exemple, votre classe World peut avoir une méthode qui trie les choses en comparant deux éléments dans une collection. Pour déterminer si un objet doit aller avant ou après un autre, vous pouvez définir une interface CallbackFunction qui a une méthode qui prend 2 choses (comme int) et retourne une valeur qui indique quelle chose devrait aller en premier. Par exemple,

public interface CallbackForSorting 
{ 
    public int compare(int a, int b); 
} 


public class World 
{ 
    List<Integer> thingsToSort; 

    public void sortThings(CallbackForSorter sorter) 
    { 
     int result = sorter.compare(thingsToSort.get(i), thingsToSort.get(i+1)); 

     if(result == 0) // elements are equal 
     if(result == -1) // thingsToSort.get(i) is "less than" thingsToSort.get(i+1) 
     if(result == 1) // thingsToSort.get(i) is "greater than" thingsToSort.get(i+1) 
    } 
} 
+0

Bonne réponse, merci – jax

Questions connexes