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

3

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

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

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接口,该接口具有一个方法,该方法接受两个事物(如整数)并返回一个值,指示哪个事物应该先放置。例如,

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接