前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具

回调

作者头像
晚上没宵夜
发布于 2020-03-10 02:51:41
发布于 2020-03-10 02:51:41
2.7K20
代码可运行
举报
运行总次数:0
代码可运行

1. 回调

回调简单而言:在一个类(A)的方法(a)中调用另一个类(B)的方法(b),当方法(b)执行完之后就调用类(A)中的方法(c),这就是回调的过程,是不是很简单?简单分析可以知道一个类(A)持有另一个类(B)的引用,方法(c)就叫做回调函数,画成UML图就如下所示:

2. 同步回调

这里模拟一个情景,小狗邀请小猫出去玩,而小猫要午睡,所以小狗要等到小猫睡醒了才一起出去玩,要实现的功能是小猫睡醒了回调通知小狗

其主要对象有:

  • 回调接口
  • 回调实现类
  • 被调用者

2.1 回调接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface Callback {
    
    // 回调函数
    public void callback();

}

2.2 回调实现类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Dog implements Callback {
    
    // 持有类B的引用
    private Cat cat;
    public void setCat(Cat cat) {
        this.cat = cat;
    }
    
    public void playOutside(){
        System.out.println("Dog:invite cat to play outside,but cat is sleep");
        cat.sleep(this);    // 重点在此,方法参数为回调类
    }
    
    @Override
    public void callback() {
        System.out.println("Dog:Let's go");
    }
    
}

2.3 被调用者

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Cat {
    
    public void sleep(Callback callback){
        System.out.println("Cat:i need to sleep");
        System.out.println("Cat:i am sleeping");
        System.out.println("Cat:i am sleeping");
        System.out.println("Cat:i am waking up");
        callback.callback();  // 在此回调
    }
}

2.4 测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class test {
    
    public static void main(String[] args) {
        
        Dog dog = new Dog();
        Cat cat = new Cat();
        
        // 设置引用
        dog.setCat(cat);
        
        // 邀请小猫出去玩
        dog.playOutside();
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Dog:invite cat to play outside
Cat:i need to sleep
Cat:i am sleeping
Cat:i am sleeping
Cat:i am waking up
Dog:Let's go

3. 异步回调

回调最重要体现在异步上,在上面的例子中,小狗在等小猫醒来的过程中是被阻塞不能执行其他任务的,所以异步回中小狗在等小猫过程中可以干其他事情,等小猫醒了再去执行出去玩这个任务,提高了执行效率

3.1 改造Dog类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Dog implements Callback {
    
    private Cat cat;
    public void setCat(Cat cat) {
        this.cat = cat;
    }
    
    public void playOutside(){
        System.out.println("Dog:invite cat to play outside");
        new Thread( () -> {
                try {
                    cat.sleep(this);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
        }).start();
    }
    
    public void watchTV(){
        System.out.println("Dog:i am watching TV");
    }
    
    public void playGame(){
        System.out.println("Dog:i am playing Game");
    }
    
    @Override
    public void callback() {
        System.out.println("Dog:Let's go");
    }
}

3.2 改造Cat类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Cat {
    
    public void sleep(Callback callback) throws InterruptedException{
        System.out.println("Cat:i need to sleep");
        System.out.println("Cat:i am sleeping");
        System.out.println("Cat:i am sleeping");
        Thread.sleep(5000);     // 猫说完就睡了5秒
        System.out.println("Cat:i am waking up");
        callback.callback();    // 猫醒来就告诉狗
    }
}

3.3 异步回调测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class test {
    
    public static void main(String[] args) throws InterruptedException {
        
        Dog dog = new Dog();
        Cat cat = new Cat();
        dog.setCat(cat);
        
        // 小狗邀请小猫
        dog.playOutside();
        
        // 这里睡1秒为了让小狗邀请小猫这个动作执行完
        Thread.sleep(1000);
        
        // 小猫午睡期间小狗执行了其他任务
        dog.watchTV();
        dog.playGame();
        
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Dog:invite cat to play outside
Cat:i need to sleep
Cat:i am sleeping
Cat:i am sleeping
Dog:i am watching TV
Dog:i am playing Game
Cat:i am waking up
Dog:Let's go
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-02-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
2 条评论
热度
最新
300字不够用后面的提示我发表在这个评论 [Choreographer] Skipped 37 frames! The application may be doing too much work on its main thread. 请大神提点一下这个问题的原因以及解决方案。
300字不够用后面的提示我发表在这个评论 [Choreographer] Skipped 37 frames! The application may be doing too much work on its main thread. 请大神提点一下这个问题的原因以及解决方案。
回复回复点赞举报
TabbedPage控件,4个子页面,切换回第一个页面是白屏了 示[CompatibilityChangeReporter] Compat change id reported: 171228096; UID 10217; state: ENABLED [nyname.mauiapp] Explicit concurrent copying GC freed 10276(592KB) AllocSpace objects, 0(0B) LOS objects, 49% free, 4416KB/8833KB, paused 48us,19us total 18.394ms
TabbedPage控件,4个子页面,切换回第一个页面是白屏了 示[CompatibilityChangeReporter] Compat change id reported: 171228096; UID 10217; state: ENABLED [nyname.mauiapp] Explicit concurrent copying GC freed 10276(592KB) AllocSpace objects, 0(0B) LOS objects, 49% free, 4416KB/8833KB, paused 48us,19us total 18.394ms
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
.NET MAUI 性能提升(下)
(本文阅读时间:9 分钟) 继上一篇文章🔗为大家介绍了启动性能的优化,今天我们来看一看其他令人欣喜的性能提升。 主要内容 ❖ 应用程序大小的改进 修复默认的MauiImage大小 删除Application.Properties 和DataContractSerializer 修剪未使用的HTTP实现 ❖ .NET Podcast示例中的改进 删除Microsoft.Extensions.Http用法 删除Newtonsoft.Json使用 在后台运行第一个网络请求 ❖ 实验性或高级选项 修剪Resour
JusterZhu
2022/12/07
2.5K0
官方盘点 .NET 7 新功能
本文翻译于 Jeremy Likness, Angelos Petropoulos 和 Jon Douglas 的博客
JusterZhu
2022/12/07
1.6K0
官方盘点 .NET 7 新功能
浅谈Xamarin Community Toolkit的未来发展
.NET MAUI会在今年晚些时候发布,我们也很高兴和大家一起分享我们对Xamarin Community Toolkit的计划! 这包括 .NET MAUI Community Toolkit、Xamarin Community Toolkit的向后兼容版本以及当前 Xamarin Community Toolkit的淘汰计划。
沙漠尽头的狼
2021/12/01
1.5K0
浅谈Xamarin Community Toolkit的未来发展
官宣!微软跨平台 UI 框架 .NET MAUI 6 正式发布!
欢迎使用 .NET 多平台应用程序 UI。此版本标志着我们在统一 .NET 平台的多年旅程中的新里程碑。现在,您和超过 500 万其他 .NET 开发人员拥有面向 Android、iOS、macOS 、Windows和Linux(由Github开源社区支持) 的一流跨平台 UI 技术栈,以补充 .NET 工具链 (SDK) 和基础类库 (BCL)。您可以使用 .NET 构建任何东西。
JusterZhu
2022/12/07
4.2K0
官宣!微软跨平台 UI 框架 .NET MAUI 6 正式发布!
.NET MAUI RC 是完整的 API 并准备好起飞 (GA)
2022年4月12日 微软发布了 .NET Multiplatform App UI (.NET MAUI) 作为候选版本RC ,具体参见 https://devblogs.microsoft.com/dotnet/dotnet-maui-rc-1/。文章说 MAUI 的 API 现在已经完成,现在只修复了一些小错误。
张善友
2022/04/28
3290
.NET MAUI  RC 是完整的 API 并准备好起飞 (GA)
.NET平台系列13 .NET5 统一平台
  时机决定一切,对于 .NET5 也是如此。实际上微软.NET团队在开始开发 .NET Core 时,对 .NET Framework 的全面重写是不可想象的。当时Microsoft 正在响应在 Linux、容器中和 PaaS 上显著增强 Azure 托管体验的需求。因此,公司专注于推出一些产品来满足客户和 Azure 产品团队的需求。
张传宁IT讲堂
2021/06/09
1.2K0
.NET平台系列13 .NET5 统一平台
.NET周刊 【7月第2期 2023-07-02】
https://www.cnblogs.com/hejiale010426/p/17529511.html
InCerry
2023/08/31
1940
.NET周刊 【7月第2期 2023-07-02】
.NET周报 【5月第3期 2023-05-21】
https://www.cnblogs.com/shawshank/p/17390248.html
InCerry
2023/08/31
4470
.NET周报 【5月第3期 2023-05-21】
dotnet 8 preview 1 即将发布
.NET 8 的第一个预览版将在几周内发布,微软的 David Ortinau 在斯德哥尔摩举行的一场在线技术活动中说。这个消息是在.NET Frontend Day 的一个.NET MAUI 的演示中透露的,这个活动可以在 YouTube 上观看。.NET 8 将在 2023 年 11 月 10 日左右的.NET Conf 2023 活动中发布,.NET GitHub 仓库显示.NET 8 的开发工作已经完成了 44%。.NET MAUI 和 Blazor 是今天.NET Frontend Day 的重点,GitHub 仓库显示有很多与它们相关的问题,例如“MAUI Android 的 ImageSharp 性能很差”、“Blazor WebAssembly 在低内存的移动设备上崩溃”等。Steve Sanderson 在一月份的 YouTube 视频中展示了一个名为 Blazor United 的新项目,它是一个原型项目,之后会被移动到了 GitHub 流程中。
newbe36524
2023/02/14
6360
dotnet 8 preview 1 即将发布
宣布 .NET MAUI 支持 .NET 7 Release Candidate 2
支持 .NET 7 Release Candidate 2 的 .NET 多平台应用程序 UI (MAUI) 现在可在 Windows 和 Mac 上的 Visual Studio 17.4 Preview 4 中使用。RC2 的主要主题是质量和对带有 iOS 16 的 Xcode 14 的 .NET 支持。此版本包含在生产中使用的上线支持许可证。
JusterZhu
2022/12/07
1.4K0
宣布 .NET MAUI 支持 .NET 7 Release Candidate 2
看看MAUI候选版本3!
我们很高兴发布 .NET 多平台应用程序 UI (.NET MAUI) 候选版本 3,这个版本包含一系列新的改进。与以前的候选版本一样,RC3 包含在“上线”支持政策中,这意味着 Microsoft 为您的MAUI生产应用程序提供技术支持。
沙漠尽头的狼
2022/06/10
1.1K0
看看MAUI候选版本3!
官宣 .NET 7 预览版3
很高兴地宣布,我们发布了.NET 7 预览版3。.NET 7的第三个预览版包括了对可观察性、启动时间、codegen、GC regions、本地AOT编译等方面的增强。您现在就可以获取并开始尝试新功能,包括:
郑子铭
2022/06/10
7270
官宣 .NET 7 预览版3
.NET周报【1月第4期 2023-01-28】
https://blog.lindexi.com/post/C-%E5%BE%88%E5%B0%91%E4%BA%BA%E7%9F%A5%E9%81%93%E7%9A%84%E7%A7%91%E6%8A%80.html
InCerry
2023/03/08
2.4K0
.NET周报【1月第4期 2023-01-28】
.NET MAUI RC2 发布,支持 Tizen 平台
在.NET多平台应用程序UI(.NET MAUI)RC1之后仅两周,微软已经发布了RC2,并以新的Tizen支持为亮点。.NET MAUI是微软对Xamarin.Forms的演变,因为它除了iOS和Android移动目标之外还增加了桌面支持,用于使用 C# 和 XAML 创建原生移动和桌面应用。使用 .NET MAUI,开发者可以创建在 Android、iOS、macOS 和 Windows 从单个共享代码库运行的应用。它本应在去年 11 月与 .NET 6 一起发布,但“滑落了时间表”,开发团队从那时起就在一系列预览中迎头赶上,包括 4 月 12 日发布的 RC1,并提供了上线支持。预计它将在下个月达到公开发布状态。候选版本通常专注于清理剩余问题并为GA打磨,但这个版本增加了对Tizen的支持,Tizen是一个开源的,基于标准的软件平台,适用于多种设备类别,包括智能手机,平板电脑,电视,上网本等。具体来说,这种支持附带 Tizen.NET,这是一种使用.NET技术为Tizen OS开发应用程序的高级方法。
张善友
2022/04/28
8060
.NET MAUI RC2 发布,支持 Tizen 平台
技术速递|.NET 9简介
今天,我们非常激动地宣布 .NET 9的发布,这是迄今为止最高效、最现代、最安全、最智能、性能最高的 .NET 版本。这是来自世界各地数千名开发人员又一年努力的成果。这个新版本包括数千项性能、安全和功能方面的改进。您会发现在整个 .NET 堆栈(编程语言、开发者工具和工作负载)都有了全面的增强,这使您能够使用统一平台进行构建并轻松地将 AI 融入您的应用程序。
郑子铭
2024/12/06
2080
技术速递|.NET 9简介
官宣 .NET MAUI 支持 Xcode 14 和 iOS 16
我们发布了对 Xcode 14 的 .NET 6 和 Visual Studio 2022 支持,以及 .NET MAUI 的第六个服务版本。Xcode 14 引入了 Apple 最新的移动操作系统 iOS 16。此版本中的其他 Apple SDK 与上一版本相比没有变化。无论您使用 UIKit 还是 .NET MAUI 构建应用程序,您现在都可以利用最新的 SDK 功能。
JusterZhu
2022/12/07
1.3K0
官宣 .NET MAUI 支持 Xcode 14 和 iOS 16
.NET周报【11月第1期 2022-11-07】
https://mp.weixin.qq.com/s/_tYpfPeQgyEGsnR4vVLzHg
InCerry
2023/03/08
3.6K0
.NET 7 RC1 正式发布
从年初2 月份发布第一个预览版,经历7个预览版后,Microsoft 西雅图时间9月14日发布了 .NET 7 RC 1:https://devblogs.microsoft.com/dotnet/announcing-dotnet-7-rc-1/ ,这是该框架在 11 月初正式发布之前的两个版本中的第一个。 .NET 7 RC1 是在生产中受支持,随着开发团队修复和完善内容,该框架基本上已经准备好了新的和令人兴奋的功能,以便在 11 月 8 日开始的 .NET Conf 2022 期间正式发布RTM。
张善友
2022/09/29
5300
.NET 7 RC1 正式发布
在.NET 8 RC1 版本中 MAUI、ASP.NET Core 和 EF8 的新特性
从年初2 月份发布第一个预览版,经历7个预览版后,Microsoft 西雅图时间9月13日发布了 .NET 8  RC 1: https://devblogs.microsoft.com/dotnet/announcing-dotnet-8-rc1/[1], 这是该框架在 11 月初正式发布之前的两个版本中的第一个。 .NET 8 RC1 是在生产中受支持,随着开发团队修复和完善内容,该框架基本上已经准备好了新的和令人兴奋的功能,以便在 11 月 14 日开始的 .NET Conf 2023 [2]期间正式发布RTM。
张善友
2023/09/14
7260
在.NET 8 RC1 版本中 MAUI、ASP.NET Core 和 EF8 的新特性
.NET周刊【11月第3期 2023-11-19】
https://www.cnblogs.com/FreeSql/p/17836000.html
InCerry
2023/11/22
4070
.NET周刊【11月第3期 2023-11-19】
相关推荐
.NET MAUI 性能提升(下)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验