我正在阅读如何实施凌空回调here
以及我们如何在代码中使用它就像这样
JsonObjectRequest jsonrequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {}
那么Response类如何能够访问这样的接口方法呢?新的Response.Listener不应该是这样的吗?
new Response().Listener();
使用响应类的对象进行访问?
这种语法来自哪里,是什么逻辑?
new Response.Listener();
答案 0 :(得分:1)
您没有实例化Response,而是实例化Listener(匿名),它是Response的内部类(接口)。
此
new Response().Listener();
是一个实例方法调用,如new Integer(42).equals(42) or new Thread(..).start()
此
new Response.Listener()
是一个匿名内部类实例化,如new View.OnClickListener(){..}
,与静态字段/方法访问相同:Boolean.TRUE, Integer.compare(1,2)
(您可以将Response视为访问Listener类的路径 - 如果它更容易为你)
答案 1 :(得分:1)
我将从你的上一个问题开始:
这种语法来自哪里,逻辑是什么?新 Response.Listener();
这种语法意味着,有一个类Response
,其中定义了一个接口或类Listener
(嵌套),在您的情况下,它是一个接口,如果你有机会查看Response
的源代码,您可能会看到类似这样的内容:
public class Response{
:
:
:
public interface Listener {
:
:
public void onResponse(JSONObject jsonObject);
}//Listener interface
}//Response class
不应该是这样的吗? new Response()。Listener();
不,您建议的代码意味着,从Response
创建一个新实例,然后从该对象调用一个名为Listener()
的方法(响应)
虽然此new Response.Listener
表示创建在Listener
Response
的新实例
奖金:现在Listener
是一个界面,您无法创建它的实例。
所以应该做的是:
1-创建implements Listener
并覆盖onResponse()
的新课程,并将其作为参数传递给JsonObjectRequest(...)
前,
public class MyListern implements Response.Listener{
@Override
public void onResponse(JSONObject jsonObject) {
//put your implementation here ...
}
}//Response class
MyListern mMyListern = new MyListern();
JsonObjectRequest jsonrequest = new JsonObjectRequest(Request.Method.GET, url, null, mMyListern);
OR
2-创建一个匿名内部类,并将其作为参数传递给JsonObjectRequest(...)
(这就是你在问题中发布的方式)
- 编辑:额外奖励:)
mMyListern是类MyListern的实例,它实现了在Response
中定义的Listener,所以它不是Response类,它是MyListener。
如果你说
,你可以将Response.Listener
视为一条路径
c:\users\john\Desktop
这是一个指向桌面的路径,存在于john
内,而john存在于users
中,因此桌面不是用户 < / p>
答案 2 :(得分:1)
它只是一个嵌套类(1)。例如:
public class A {
...
public static class B { ... }
}
A类就像B类的包,所以要创建一个你需要编写的新实例
new A.B();
但实际上该代码实例化了一个扩展内部类的匿名类:
B myB = new A.B() {
//methods overriden here
};
(1)B也可以是一个界面。在这种情况下,您无法实例化它,因此唯一的选择是创建一个匿名类。我没有读过该Response类的当前实现,所以我不知道Listener是一个类还是一个接口