Как использовать обратные вызовы в моем собственном коде - PullRequest
3 голосов
/ 25 февраля 2010

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

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

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

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

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

1 Ответ

4 голосов
/ 25 февраля 2010

Функции обратного вызова довольно просты в 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)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...