2010-02-25 5 views
2

Здесь я обновляю свой мир, чтобы включить размер холстаКак использовать обратные вызовы в моем собственном коде

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

Есть ли лучший способ сделать это? Есть ли способ, который я могу автоматически обновить мой объект мира без необходимости вручную вызывать его в методе setSurfaceSize, но вместо этого вызывать его из My world class?

Я предполагаю, что могу использовать какой-то обратный вызов, но я не понимаю их!

/* 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); 
    } 
} 

ответ

4

Функции обратного вызова довольно просты в Java. Способ сделать это - просто определить некоторый интерфейс A, который имеет единственный метод m(), а затем добавить коллекцию типа A в ваш класс World. Затем, в какой-то момент вашего объекта World вы хотите перебрать свою коллекцию A и вызвать метод m() для каждого элемента. Чтобы добавить в свой мир «функции обратного вызова», вы просто определяете некоторый класс, который реализует ваш интерфейс A и помещает его в коллекцию объектов A вашего класса World. Например,

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>); 
     } 
    } 
} 

Затем добавить функцию в свой мир:

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

Я оставляю остальное до вас, но это должно дать вам хорошее представление о том, как обратные вызовы обычно реализуются в Java ,

Вам также не нужно хранить общую коллекцию функций обратного вызова, у вас могут быть специальные функции обратного вызова в сочетании с определенными методами в вашем классе World. Например, ваш класс World может иметь некоторый метод, который сортирует вещи, сравнивая два элемента в коллекции. Чтобы определить, должен ли идти один объект до или после другого, вы можете определить интерфейс CallbackFunction, у которого есть метод, который принимает 2 вещи (например, int) и возвращает значение, указывающее, какая вещь должна идти первой. Например,

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

Отличный ответ, thx – jax

Смежные вопросы