接口回调的理解
2018-02-23 08:13
267 查看
接口回调的含义:
接口回调是指:可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称为对象功能的接口回调。看下面示例。
![](https://img-blog.csdn.net/20180105142002056?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb3dlbl9CTEFORA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
举个例子:某天,我打电话向你请教问题,当然是个难题,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。
C不会自己调用b,C提供b的目的就是让S来调用它,而且C不得不提供。S并不知道C提供的b是什么,因此S会约定b的接口规范(函数原型),然后由C提前通过S的一个函数r告诉S自己将要使用b函数(即注册)。r为注册函数。
简单来说:回调函数就是预留给系统调用的函数,而且我们往往知道该函数被调用的时机,那我们继续完善下上面的那幅图。
向上转型与接口回调的区别
看似向上转型和接口回调是一回事。看下面两句话,均出自Thinking in Java。
使用接口的核心原因:为了能够向上转型为多个基类型。即利用接口的多实现,可向上转型为多个接口基类型
从实现了某接口的对象,得到对此接口的引用,与向上转型为这个对象的基类,实质上效果是一样的。
所以,我认为,这两个概念是从两个方面来解释一个行为。接口回调的概念,强调使用接口来实现回调对象方法使用权的功能(下一章节详细分析)。而向上转型则牵涉到多态和运行期绑定的范畴。
//代码示例
public class MyTask extends AsyncTask<String,Void,String> {
//2.申明接口类型变量
private ICallBacks iCallBacks;
//4.传入实现此接口的类对象
public MyTask(ICallBacks iCallBacks) {
this.iCallBacks = iCallBacks;
}
@Override
protected String doInBackground(String... strings) {
try {
URL url=new URL(strings[0]);
HttpURLConnection connection =(HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setReadTimeout(5000);
connection.setConnectTimeout(5000);
if(connection.getResponseCode()==200){
InputStream inputStream = connection.getInputStream();
String s=StreamToStingUtis.streamToString(inputStream);
return s;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
//3.调用接口
iCallBacks.getJson(s);
//iCallBacks=new MainActivity();
// iCallBacks.getJson(s);
}
//1.定义一个接口
public interface ICallBacks{
void getJson(String json);
}
}
接口回调是指:可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称为对象功能的接口回调。看下面示例。
举个例子:某天,我打电话向你请教问题,当然是个难题,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。
C不会自己调用b,C提供b的目的就是让S来调用它,而且C不得不提供。S并不知道C提供的b是什么,因此S会约定b的接口规范(函数原型),然后由C提前通过S的一个函数r告诉S自己将要使用b函数(即注册)。r为注册函数。
简单来说:回调函数就是预留给系统调用的函数,而且我们往往知道该函数被调用的时机,那我们继续完善下上面的那幅图。
向上转型与接口回调的区别
看似向上转型和接口回调是一回事。看下面两句话,均出自Thinking in Java。
使用接口的核心原因:为了能够向上转型为多个基类型。即利用接口的多实现,可向上转型为多个接口基类型
从实现了某接口的对象,得到对此接口的引用,与向上转型为这个对象的基类,实质上效果是一样的。
所以,我认为,这两个概念是从两个方面来解释一个行为。接口回调的概念,强调使用接口来实现回调对象方法使用权的功能(下一章节详细分析)。而向上转型则牵涉到多态和运行期绑定的范畴。
//代码示例
public class MyTask extends AsyncTask<String,Void,String> {
//2.申明接口类型变量
private ICallBacks iCallBacks;
//4.传入实现此接口的类对象
public MyTask(ICallBacks iCallBacks) {
this.iCallBacks = iCallBacks;
}
@Override
protected String doInBackground(String... strings) {
try {
URL url=new URL(strings[0]);
HttpURLConnection connection =(HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setReadTimeout(5000);
connection.setConnectTimeout(5000);
if(connection.getResponseCode()==200){
InputStream inputStream = connection.getInputStream();
String s=StreamToStingUtis.streamToString(inputStream);
return s;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
//3.调用接口
iCallBacks.getJson(s);
//iCallBacks=new MainActivity();
// iCallBacks.getJson(s);
}
//1.定义一个接口
public interface ICallBacks{
void getJson(String json);
}
}
相关文章推荐
- Android对回调接口的理解
- Java到Android小项目(自定义Dialog)来理解接口回调在项目中的应用
- 6.3 Java中接口回调的初步理解
- 一个故事理解什么是接口回调
- 什么是接口回调,接口回调与向上转型的区别,回调函数的理解
- 一个故事理解什么是接口回调
- 最简单的方式理解“接口回调”的设计
- android回调的理解------异步任务回调接口
- 接口回调机制理解
- Android接口回调深入理解
- 最简单的方式理解“接口回调”的设计
- 最简单的方式理解“接口回调”的设计
- Java到Android逐步理解接口回调
- 关于java的接口回调和向上转型的理解
- 【java|Android接口回调】小小猿理解的接口回调
- java中接口回调的理解
- Android接口回调,最简单的理解方式
- 接口回调基础理解
- android 回调的理解(结合接口)
- 自己理解接口回调入门