我在此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界面中所知道的那样是某种契约和某种具有某种方法的抽象类。接口需要在实际使用之前实现,但在上面的代码中没有任何实现代码....
但基于该接口的新对象可以填充为侦听器。需要一些简洁的解释为什么会出现这个概念。
感谢您的任何解释。
答案 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。