回调和接口之间的区别

时间:2017-08-15 13:31:17

标签: java android oop interface callback

这两段代码有什么区别

 btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

        }
    });

是View类的内部接口,如果是这样,我们知道接口无法实例化

在这里

soInterface.getAnswers().enqueue(new Callback<SOAnswersResponse>() {
      @Override
      public void onResponse(Call<SOAnswersResponse> call, retrofit2.Response<SOAnswersResponse> response) {

      }

      @Override
      public void onFailure(Call<SOAnswersResponse> call, Throwable t) {

      }
  });

它在enqueue方法中需要的回调,这个语法定义的是接口“CallBack&lt;&gt;”定义了一些在哪里,我们在这里调用它作为内联接口,但是再次接口无法实例化,如回调语法说“new CallBack(){}”

5 个答案:

答案 0 :(得分:1)

  

这两段代码有什么区别

两者都是2个不同的界面

View.OnClickListener - 此界面可帮助您收听查看点击操作

Callback<SOAnswersResponse> - 尝试从服务器获取响应

答案 1 :(得分:1)

它们都是接口:

  • CallBack表示Retrofit的响应(回调),当它出现时你进入onResponse或者它无法回复(在10s时间范围内),被读取(错误解析)或其他原因然后onFailure将被执行。

  • onClickListener将按下按钮点击。

您可以在Activity或Fragment中实现onClick侦听器的接口,并使用button.setOnClickListener(this)与Retrofit相同。

答案 2 :(得分:0)

View.OnClickListenerCallback都是接口。

OnClickListener嵌套在View类中。改造Callback不是嵌套的。

这是Callback界面doc:https://square.github.io/retrofit/2.x/retrofit/retrofit2/Callback.html

  

接口无法实例化

我们在这里实例anonymous class。即我们将interface实现为anonymous class并动态实例化anonymous class

来自Java doc

  

他们[匿名类]使您能够声明和实例化一个类   同时。他们就像当地的班级,但他们没有   有一个名字。如果您只需要使用本地类一次,请使用它们。

答案 3 :(得分:0)

这种情况下的两个类都是带回调的接口。匿名类实现View.OnClickListener,它在onClick上有回调。实现Callback<SOAnswersResponse>()的匿名类也是如此。这次它有一个类型参数和两个onResponseonFailure的回调。

接口无法实例化的声明是正确的,但您可以创建它的匿名类。见Can we create an instance of an interface in Java?

答案 4 :(得分:0)

您更正了,无法实例化界面。接口是必须由具体类实现的一组方法的定义。

在两种情况下,您的代码使用的是匿名内部类。 Java语法允许您指定您想要一个新的实例&#39;实现指定的接口,但你不想写所有代码来做到这一点。您的代码仅提供该接口定义的抽象方法的实现。

如果查看应用程序的类文件,您将看到类似MyClass $ 1.class的内容,它是由编译器综合生成的类文件。编译器创建一个名为MyClass $ 1的类,它实现了您使用已定义的方法指定的接口。然后编译器会在编译之前使代码看起来像这样:

Gender
{
   int GenderID 
   GenderType 
}

SeriesCategory
{
   int SeriesCategoryID
   string SeriesCategoryName
   int GenderID
}

Region
{
   int RegionID
   string RegionName
   int SeriesCategoryID
}

Series
{
   int SeriesID
   string SeriesName
   int RegionID
   int SeriesCategoryID
}

这同样适用于第二个例子,但具有不同的界面等。