1.什么是回调

回调的定义是在A类中定义了一个方法,这个方法中用到了一个接口和该接口中的抽象方法,但是抽象方法没有具体的实现,需要B类去实现,B类实现该方法后,它本身不会去调用该方法,而是传递给A类,供A类去调用,这种机制就称为回调,这个定义比较正式,但看起来太绕了,一会A类一会B类,把人绕晕了。

使用日常生活中的例子来理解一下,回调英文单词是Callback,直译为回呼或者回电话,那就用跟电话有关作为例子吧,假设一个客户(客户是公司A的员工)问你(你是公司B的员工)一个问题,例如如何赚大钱,但这个问题你当场不能给出答案,以免显得很草率,这个时候你可以跟客户说,稍等一下,等确认后再给您回个电话,这样就可以挂了电话,想一下应该怎么回复客户,等有了答案后,再给客户回电话。这个过程使用到了回调机制。

再回头来理解回调函数的定义,客户就是A类,你是B类,而接口呢,指的是电话,接口的抽象方法,就是客户咨询你的问题的过程,确认问题这个过程当然得由你去实现,你实现之后(确定问题答案之后),再给客户回电话,完成回调过程。

2.为什么用回调

从打电话的例子可以看到回调的好处,分别是:
1.异步处理问题
如果不采用回调机制,客户需要一直在干等你的答案,你找答案的过程中,他啥也干不了,而采用回调方式后,客户不需要一直在电话前等回复,可以先忙自己的事去。在程序中,例如执行一个耗时的下载任务,最优的处理方式采用异步方式,即主程序启动下载后可以忙别的,下载程序执行完下载后告知主程序就行,这是异步处理带来的好处。

2.同一个事件有不同的处理方法
还是用客户打电话咨询问题的例子。当我们确认好问题要回客户的问题时,可以由你自己亲自回复,也可以由其他同事代回复,只要完成回复客户的约定即可。注意到回调定义中提到接口中的抽象方法,实现抽象方法方式多种多样,只要重写这个抽象方法就行。

3.代码例子

1.首先定义一个接口和抽象方法,如下:

//定义回调接口
public interface PhoneCallback{void Counseling();
}

2.定义一个公司A的类,在该类中实现对接口的调用


public class CompanyA {private PhoneCallback callBack;public CompanyA(){}public String Work(PhoneCallback callBack){//调用接口的抽象方法String answer= callBack.Counseling();return answer;}
}

3.定义一个公司B的类,在该类中实现接口的抽象方法,也就是确定好答案回复客户的咨询

public class CompanyB implements PhoneCallback {//重写抽象方法@Overridepublic String Counseling() {String answer="公司B的答复:这个问题建议您咨询有关部门";return answer;}
}

4.用界面展示以上的过程。其实以上已经完成了回调,这一步是用界面展示一下整个流程以及最终结果。

4.1 界面布局。布局很简单,一个Button按钮用于公司发起咨询和一个TextView展示结果。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/tvResult"android:layout_width="wrap_content"android:layout_height="wrap_content"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><Buttonandroid:id="@+id/bCompany"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="27dp"android:layout_marginTop="32dp"android:text="公司A发起咨询"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>

4.2 主界面MainActivity代码

import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;public class MainActivity extends AppCompatActivity {Button bCommpanyA;TextView tvResult;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bCommpanyA=findViewById(R.id.bCompany);tvResult=findViewById(R.id.tvResult);bCommpanyA.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {CompanyA cA=new CompanyA();CompanyB cB=new CompanyB();String answer= cA.Work(cB);tvResult.setText(answer);}});}
}

4.3 结果展示,点击按钮后,TextView控件展示了公司B的回复

5.总结

理解回调的过程,关键需要捋清楚其中的关系,首先回调肯定涉及到多方(多个类)之间互动,例子中是公司A和公司B,其实还可以有公司C,D等加入,而他们之间沟通的媒介是接口(Interface)和抽象方法,接口相当于现实生活中电话,抽象方法相当于打电话咨询如何赚大钱,公司A可以咨询公司B如何赚大钱,也可以咨询公司C和公司D等如何赚大钱,而具体怎么回复,看各个公司想如何回复了,等他们想好了怎么回复,拿起电话打给公司A。关系捋清楚,已经算基本理解回调了。

Android回调的简单理解相关推荐

  1. Android:LayoutParams简单理解和说明

    LayoutParams 1.LayoutParams 1.1 定义 1.2 使用说明 1.3 LinearLayout.LayoutParams使用 参考 1.LayoutParams 写的非常好 ...

  2. 回调函数 简单理解

    初学js的时候,被回调函数搞得很晕,现在回过头来总结一下什么是回调函数. 我们先来看看回调的英文定义:A callback is a function that is passed as an arg ...

  3. android中适配器的作用,适配器模式 在Android中的简单理解

    Android 在Android上提到适配器模式就会想到最常用的ListView和BaseAdapter 在这个功能的使用中,类似于适配器模式的对象适配器 例如在ListView中想用一个getVie ...

  4. Android状态机的简单理解

    Android 中 StateMachine 机制 分层处理消息的状态机,能够分层排列 在不同的状态下,收到不同的消息时,在不同的阶段做出不同的响应. StateMachine 处于 Android ...

  5. Android:RecyclerView简单理解和基本使用

    RecyclerView RecyclerView 一.RecyclerView 二.RecyclerView基本介绍: 三.RecyclerView基本实现: 参考 RecyclerView 一.R ...

  6. Android:安卓学习笔记之navigation的简单理解和使用

    Android navigation的简单理解和使用 1 .基本概念 1.1.背景 1.2.含义 2.组成 2.1.Navigation graph 2.2.NavHostFragment 2.3.N ...

  7. Android:安卓学习笔记之Bitmap的简单理解和使用

    Android Bitmap的简单理解和使用 Android Bitmap 一.Bitmap的定义 二.Bitmap的格式 2.1 存储格式 2.2 压缩格式 三.Bitmap创建方法 3.1 Bit ...

  8. android 点击事件消费,Android View事件分发和消费源码简单理解

    Android View事件分发和消费源码简单理解 前言: 开发过程中觉得View事件这块是特别烧脑的,看了好久,才自认为看明白.中间上网查了下singwhatiwanna粉丝的读书笔记,有种茅塞顿开 ...

  9. Android:同步屏障的简单理解和使用

    同步屏障的简单理解和使用 1.背景 2.何为同步屏障? 2.1. 发送屏障消息--postSyncBarrier 2.2.发送异步消息 2.3.处理消息 2.4.移除屏障消息--removeSyncB ...

最新文章

  1. 【必看】CCNA初学者必看的一篇文章
  2. 【干货】产品经理处理工作中突发事件的新技能Get!
  3. 【ABAP】SAP销售订单定价值变更
  4. Linux上快速搭建Jenkins服务器 实现持续集成开发
  5. C# 发送邮件的记录(qq,126,Gmail)
  6. iOS项目功能模块封装SDK使用总结
  7. Spring Cloud与微服务学习总结(9)——Spring Cloud面试题汇总
  8. 计算机专业教研成绩,2018学年第一学期计算机组教研组工作计划
  9. C# 开发和使用中的32个技巧
  10. Android8.1展讯平台之audio_policy_configuration.xml(四十二)
  11. python颜色参数_python matplotlib:plt.scatter() 大小和颜色参数详解
  12. 爬虫练习生|爬虫前奏(爬虫介绍、工具的安装、爬虫分类、爬虫须知)
  13. 六大重要策略与技巧,让我们更有效在领英(LinkedIn)开展线上营销
  14. 解决IOS下window.open页面打不开问题
  15. 文章4:多功能智能跟随行李箱控制系统设计 | 本科毕业设计 - 【资料搜索技巧+参考资源整合】
  16. 艺赛旗(RPA)【服务端】修改服务器访问端口
  17. Libuv 句柄优雅关闭
  18. 毕业四个月,一个初出校门的程序员的生活现状
  19. NCR(numeric character reference)字符转换成真实字符
  20. 名悦集团:买车选色有哪些注意事项

热门文章

  1. boost::geometry::detail::tupled_output_has用法的测试程序
  2. boost::fibers模块实现multiple streams的测试程序
  3. Boost:与gz文件相关的操作实例
  4. ITK:可视化静态稀疏Whitaker 2D水平设置图层
  5. VTK:Utilities之PiecewiseFunction
  6. OpenCV gapi模块基本API的实例(附完整代码)
  7. OpenCV使用F变换进行修补
  8. C++Slow Sort慢排序的实现算法(附完整源码)
  9. C++Miller Rabin算法的实现(附完整源码)
  10. C++使用链表实现stack堆栈(附完整源码)