回调函数
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

接口回调的简单解释就是:比如我这个类实现了一个接口里的方法 doSomething,然后注册到你这里,然后我就去做别的事情去了, 你在某个触发的时机回头来调用我 doSomething 的方法。

通过上面的解释,定义接口回调一般分为如下几步:
1. 声明回调函数的统一接口interface A,包含方法fuc();
2. 在调用类caller内将该接口设置为私有成员private A XXX;
3. 在caller内提供一个public方法,可以将外部“该接口A的实现类的引用”通过形参传给XXX;
4. caller的某个方法call()中会用到XXX.fuc()方法;

简单实例

  • 在类中定义一个Interface, 并在接口中定义一个抽象方法
public interface  ShowCallBack{void onShown();}
  • 在类中定义一个该接口的成员变量
private ShowCallBack mShowCallBack;
  • 在类中定义一个公共方法,可以设置这个接口的对象,调用该方法给接口对象变量赋值
public void setShowCallBack(ShowCallBack c){mShowCallBack = c;}
  • 在合适的时机调用接口对象中的方法
public void onResume() {super.onResume();if (mShowCallBack != null) {mShowCallBack.onShown();}}
  • 注册接口回调
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);FragmentManager manager = getFragmentManager();FragmentTransaction tr = manager.beginTransaction();if (mTalkingFragment == null) {mTalkingFragment = new TalkingFragment();/*** 实现一个接口实例,实现具体的回调方法,并注册给调用方,*/mTalkingFragment.setShowCallBack(new TalkingFragment.ShowCallBack() {@Overridepublic void onShown() {Log.d(TAG, "onShown: ok !!!!!!!!!!!!!!!!!");}});}if (!mTalkingFragment.isAdded())tr.add(R.id.main_content, mTalkingFragment);tr.show(mTalkingFragment);tr.commit();}

完整代码

public class TalkingFragment extends BaseFragment {/*** 2.申明一个接口对象*/private ShowCallBack mShowCallBack;/*** 1. 定义一个接口,以便程序员B根据我的定义编写程序实现接口。*/public interface  ShowCallBack{void onShown();}/*** 3. 对接口对象赋值,参数为实现了接口的实例* 调用实现了接口的实例的方法就完成了回调* @param c*/public void setShowCallBack(ShowCallBack c){mShowCallBack = c;}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {return super.onCreateView(inflater, container, savedInstanceState);}/*** 4. 在合适的时机,调用回调函数* @param c*/@Overridepublic void onResume() {super.onResume();if (mShowCallBack != null) {mShowCallBack.onShown();}}
}

在代码中:
1. TalkingFragment 定义了回调接口 ShowCallBack,并持有 ShowCallBack 的引用,同时向外部提供对变量赋值的方法 setShowCallBack ;
2. MainActivity 通过 TalkingFragment 的实例,调用 setShowCallBack(ShowCallBack c) 向 TalkingFragment 注册回调接口 ;
3. TalkingFragment 在合适的时机 (onResume),调用回调接口,通知 MainActivity 我已启动,在接口实现中打印log。

在现实生活中也有类似的例子:
某天,我打电话向你请教问题,当然是个难题,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。故事到此结束。这个例子说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必须在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。
而在程序代码中,则可以抽象成以下这张图的形式:

C 不会自己调用 b,C 提供 b 的目的就是让 S 来调用它,而且 C 不得不提供。S 并不知道 C 提供的b是什么,因此 S 会约定 b 的接口规范(函数原型),然后由 C 提前通过S的一个函数 r 告诉 S 自己将要使用 b 函数(即注册),比如注册监听器就是其中一种典型。其中r为注册函数。
对上图的一个完善是这样的:

Android 接口回调实例相关推荐

  1. android 点击接口回调,带你了解Android接口回调机制

    Android接口回调机制 接口回调是在Android中运用广泛的一种机制,你一定会眼熟它,接下来,我们从两个方面来了解接口回调 Android源码 自行动手实际运用 1.从setOnclickLis ...

  2. android接口回调的两中简单写法

    android接口回调的两中简单写法--B509小贴士 一.第一种内部重写(较简单,常用异步) (1)创建接口 ,并实现方法 (2)在获取数据类中实现传递接口对象为参数的方法 (3)在主类中调用返回数 ...

  3. Android - 接口回调 interface(类外部接口)

    链接是类内部的接口:https://blog.csdn.net/u012246458/article/details/91446288 下面是类外部的接口→ 介绍: 使用接口的核心原因:为了能够向上转 ...

  4. 大话 java android 接口回调 全面解析点击事件 大量举例

    越努力,越幸运! 梦想终会一步一步实现. 阅读本文,收获什么: 1.理解什么是接口回调 2.解析点击事件(基于回调接口实现) 3.模仿,应用点击事件 4.应用接口回调在真实需求中- a. recycl ...

  5. android 接口回调全面,Android 回调机制--接口回调

    刚开始学习接口回调的时候,乍一听接口回调这个名词感觉很高大上一样 于是就去网上找了一些接口回调的知识 网上总结的接口回调知识 感觉太臃肿 又是图 又是代码的搞不清楚 所以今天就把我对接口回调的理解分享 ...

  6. Android 接口回调(有史以来最实用最简单的例子)

    官方解释: 接口回调是指:把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法. 我的例子: 我在微信上跟女朋友求婚了.可是等半天她没来微信.于是我 ...

  7. Android 接口回调

    学而时习之,温故而知新, 随着工作时间的增长以及学习的深入,自己也开始带了新人,问了很多问题,可能自己现在感觉很简单 但是想相处自己入门的时候也是感觉蒙蔽的很,最近可能会总结一些入门的知识,算是帮助他 ...

  8. java中接口回调_Java中的接口回调实例

    定义: /** * @author Administrator * @project: TestOne * @package: PACKAGE_NAME * @date: 2018/11/30 003 ...

  9. android接口回调!为什么有人说Android开发不再吃香?内含福利

    Android开发前景怎么样? 很多人说Android开发前景越来越差了 我觉得这个回答是片面的 首先Android应用开发前景差是在最近两年出现的,也就是从2018开始,从那时起移动端的程序员已经慢 ...

最新文章

  1. python简单的web服务器
  2. 阿里云服务器CentOS6.9 nexus私服使用
  3. React开发(119):代码原因
  4. wap手机网页html5通过特殊链接移动设备:打电话,发短信,发邮件详细教程
  5. Python编程输出所有的“水仙花数”
  6. 华硕ASUS acrh17 PandoraBox固件
  7. 方差分析、T检验、卡方分析|LSD检验可用于方差同质性检验|LSD检验法与t检验相比的优点
  8. ROS 学习踩坑笔记5-Intel D435相机不发布点云,在RVIZ中,不显示点云(wants topic /image/compressed to have datatype/md5sum)
  9. onu光功率多少是正常_光猫的收发光功率正常范围是多少
  10. 【傅里叶变换】离散傅里叶正变换和离散傅里叶逆变换
  11. 华为前缀列表ip ip-prefix
  12. python nonlocal 的应用
  13. Vscode 文件中 查找替换局部查找替换快捷键
  14. Access denied for user ''@'localhost' to database
  15. 华为v3鸿蒙系统_【华为鸿蒙系统下载】华为鸿蒙系统 v3.3.5 官方最新版-趣致软件园...
  16. 从原理到代码:大牛教你如何用 TensorFlow 亲手搭建一套图像识别模块
  17. 独立端漫画小程序源码/看漫画微信小程序源码
  18. Android 向系统日历添加日程
  19. 多暂估的库存如何调整_多暂估的应付账款要如何调整
  20. 代码洁癖系列(六):处理错误

热门文章

  1. 云服务器信息泄露,云服务器数据泄露
  2. android nfc开发教程,Android NFC开发实战
  3. android 引入字体文件,Android 导入字体(goolge io 2017)
  4. excel流程图连接线锁定_流程图_excel版
  5. 变量与常量的本质区别,以及由此引出的深入思考(纯文字解释,不附图,图像自己在大脑中构建)
  6. 好用的前端组件-大数据看板
  7. php注销源码,phpsession创建注销初始化注册实例教程-PHP源码
  8. php获取用户ip地理位置利用淘宝IP库
  9. 美国网件(NETGEAR) GS108Ev3 千兆简单网管交换机文档
  10. pythonpptx库api干果加_使用Python操作Evernote API