为什么接口可以用来获取java的回调?

时间:2016-06-29 05:31:17

标签: java android oop android-volley

我在此question上使用此代码:

   public void getString(final VolleyCallback callback) {
    StringRequest strReq = new StringRequest(Request.Method.GET, url, new     Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            result=response;
            callback.onSuccess(result);
        }
    }...
}}

public interface VolleyCallback{
    void onSuccess(String result);
}

我的问题是为什么此界面可用于收听回复。正如我在java界面中所知道的那样是某种契约和某种具有某种方法的抽象类。接口需要在实际使用之前实现,但在上面的代码中没有任何实现代码....

但基于该接口的新对象可以填充为侦听器。需要一些简洁的解释为什么会出现这个概念。

感谢您的任何解释。

5 个答案:

答案 0 :(得分:2)

接口(Response.Listener<String>)在这里实现为匿名类实例:

....
new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
        result=response;
        callback.onSuccess(result);
    }
}
....

这相当于创建一个实现Response.Listener<String>的类,然后将该类的实例传递给StringRequest构造函数。

答案 1 :(得分:1)

这称为Observer Pattern或其变体,在其中实例化一个新对象,该对象遵守该接口的约定并将其引用传递给调用者,因此它可以使用当它完成它正在做的任何事情时,该对象。之所以使用它,是因为在匿名类中为这么小的任务定义你的行为是切实可行的。

如果你的回调中有很多重复的行为,你也可以创建一个实现回调接口的具体类,并将这样的实例传递给调用者。

答案 2 :(得分:1)

这个想法和这里一样

public class Button {
    private Callback callback;

    public Button(Callback callback) {
        this.callback = callback;
    }

    public void update() {
        // Check if clicked..
        callback.onClick(this);
    }

    public interface Callback {
        public void onClick(Button Button);
    }
}


Button b = new Button(new Callback() {
    @Override
    public void onClick(Button b) {
        System.out.println("Clicked");
    }
});

在您的情况下,StringRequest期望实现方法onResponse的Object。稍后这个方法将被回调,代码体将被执行。

当你发送一个对象时,你实际上发送了一个对它的引用。调用者期望调用某些方法的可能性(它希望您实现某些接口)。

答案 3 :(得分:0)

调用getString()函数时,您需要传递接口的实际实现。

答案 4 :(得分:0)

这也是一种观点: -

Java的面向对象模型目前不支持方法指针,因此似乎排除了使用这种舒适的机制。 Java对接口的支持提供了一种机制,我们可以通过它获得the equivalent of callbacks