如何在我自己的代码中使用回调

时间:2010-02-25 06:03:46

标签: android

在这里,我更新我的世界以包括画布大小

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

1 个答案:

答案 0 :(得分:4)

回调函数在Java中非常简单。这样做的方法是简单地定义一个具有单个方法m()的接口A,然后将类型A的集合添加到您的World类中。然后,在World对象的某个点上,您希望迭代A集合并在每个元素上调用方法m()。要向您的World添加“回调函数”,您只需定义一个实现接口A的类,并将其放在World类的A对象集合中。例如,

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