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

接口回调的简单解释就是:比如我这个类实现了一个接口里的方法 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 np fft_Python的武器库05:numpy模块(下)
  2. All Things OpenTSDB
  3. RxSwift之深入解析URLSession的数据请求和数据处理
  4. excel办公常用的宏_让领导看傻!精美168套办公常用excel模板免费领
  5. 使用Beautifulsoup去除特定标签
  6. PyTorch 1.0 中文文档:torch.utils.cpp_extension
  7. 为什么微型芯片是机器学习的命门?
  8. strchr,wcschr 及strrchr, wcsrchr,_tcschr,_tcsrchr函数
  9. Mac使用OpenCV项目步骤
  10. Thinkpad x230 win7/xp 双系统安装全过程
  11. Word尾注——论文参考文献
  12. 提高电脑速度的超多方法。
  13. 【产业互联网周报】阿里云栖大会、百度世界大会召开:阿里重推“云端一体”、百度AI全面升级...
  14. 数理逻辑习题集(3)
  15. 我的世界服务器自定义附魔外挂,我的世界怎么用命令方块刷自定义附魔神器
  16. 是什么意思怎么读_知识丨南无怎么读?是什么意思?
  17. CSS鼠标事件和键盘事件练习
  18. 前后端齐全的扫码点餐小程序(后端Java)
  19. Word中更新图表所有的域
  20. 【C++_OJ_指针】货币兑换(指针与常量)

热门文章

  1. Android筑基——BroadcastReceiver 的动态注册、发送和接收过程(基于api21)
  2. 3D游戏编程与设计 PD(牧师与恶魔)过河游戏智能帮助实现
  3. “中国诺贝尔奖”首位女得主王小云:哈希函数是区块链的起源性技术,区块链已扩展到供应链金融等多领域...
  4. Git GitHub 的安装配置
  5. mysql5.7.17_mysql-5.7.17的最新安装教程
  6. 利用python—matplotlib绘制股票K线图
  7. OO课程仓库部署使用GitLab CI
  8. PDF转Word完全指南:3大方法满足各种场景!
  9. Flutter 自定义Widget 圆角矩形加三角指示器
  10. 帝国cms html5 编辑器,帝国编辑器自动排版插件