浅析回调机制,这是一篇骚骚的文章

浅析 Angular $q promise 回调异步嵌套解决机制 前言大概一个多个月忙着做公司开发的项目,做这个项目以来有些心得,但是感觉还是不如闷头学来的快,毕竟是实战,在这一个月以来,经历过各种适应布局,还算小有收获,不过最大的遗憾是荒废了angular的学习进度,所以趁着闲季,小补一下Angular ,也算对自己的一个巩固。一 、Promise的出现随着node.js的出现,异步逐渐被普及到web程序中来,随着异步带来的好处,也伴随着“回调噩梦”的出现,比如 阅读详情

序:

先给一个,我对回调机制的认识:回调就是我不知道你调用这个 具体 干嘛,但是我知道你 大概 要干什么。
比如点击,写源码的人不知道点击按钮之后登陆,还是弹出对话框,但是写源码的人知道按钮加载出来并且人的手触摸并抬起这个动作就是点击。

我们先不看android的点击事件,我们先自己做一个回调。

第一章: 校长要去开会

想象一个场景(郑重承诺,本例不针对任何一个人,只是举例,如果引起不适,请关闭)

大家都上过学,学校的boss假设就是 校长 ,校长的工作是管理同学们好好学习,快乐成长。但是一个校长管理不过来好几千名学生,所以要把工作分给 班主任 和 教导处主任 。

一个学校总有那么几个调皮捣蛋的学生,那么校长就得管管,管的方式假设有两种说(talk)和打(fuck),但是校长没时间,因为校长去开会了,就把任务交给班主任和教导处主任有可能还有别的老师。好了,校长在走之前先定义好了说和打的模块。

package TestCallBack;
/**
 * 校长类(关于类名我的英文水平就这样,爱看不看)
 * @author Robin
 *
 */
public class XiaoZhang {

    //工作的引用
    DoJob mDoJob;

    //定义工作类型
    public interface DoJob {
        void talk(String teacherName);//说

        void fuck(String teacherName, String tool);//打
    }

    //对外暴露调用位置
    public void setmDoJobCallBack(String teacherName, String tool, DoJob doJob) {
        if (doJob != null) {
            doJob.talk(teacherName);//工作是-->说
            doJob.fuck(teacherName, tool);//工作是-->打
        }
    }

}

第二章:校长走了,学生炸了,老师火了

校长走后,同学们为所欲为,班主任见状不妙,马上开始工作。

package TestCallBack;

import TestCallBack.XiaoZhang.DoJob;

/**
 * 班主任
 * 
 * @author Robin
 * 
 */
public class ClassTeacher implements DoJob {

    public void talk(String teacherName) {
        // 班主任开始跟学生交谈
        System.out.println("班主任  "+teacherName + "  开始口头教育学生");
    }

    public void fuck(String teacherName, String tool) {
        // 班主任开始干学生
        System.out.println("班主任  "+teacherName + "  开始用  " + tool + "  打学生");
    }

}

(声明,我们不提倡打学生)

班主任:喂,校长吗?我要管学生了
校长:好
于是校长就new 了一个对象,并把班主任传进来,让班主任管学生

XiaoZhang xz = new XiaoZhang();// 创建一个校长

xz.setmDoJobCallBack("李二狗", "教鞭", new ClassTeacher());

log打印如下:(用eclipse怎么了?谁不是从ec过来的。。。)
这里写图片描述

教导主任管理学生同理:

package TestCallBack;

import TestCallBack.XiaoZhang.DoJob;

/**
 * 教导处主任
 * 
 * @author Robin
 * 
 */
public class JaoDaoChuTeacher implements DoJob {
    public void talk(String teacherName) {
        // 教导处主任开始跟学生聊天
        System.out.println("教导处主任  " + teacherName + "  开始口头教育学生");
    }

    public void fuck(String teacherName, String tool) {
        // 教导处主任开始打学生
        System.out
                .println("教导处主任  " + teacherName + "  开始用  " + tool + "  打学生");
    }

}

创建对象,并执行

XiaoZhang xz = new XiaoZhang();// 创建一个校长
xz.setmDoJobCallBack("蒙哥·卡恩", "斧头", new JaoDaoChuTeacher());

log打印如下:
这里写图片描述

这个地方注意,如果我想改写教导主任的talk,fuck方法,怎么写?

xz.setmDoJobCallBack("蒙哥·卡恩", "斧头", new JaoDaoChuTeacher(){

            @Override
            public void talk(String teacherName) {
//              super.talk(teacherName);
                System.out.println(teacherName);//只打印教导主任的名字
            }

            @Override
            public void fuck(String teacherName, String tool) {
                super.fuck(teacherName, tool);//又想执行被教导主任打的方法
                System.out.println("被教导主任请去喝茶嗑瓜子");//打完之后又喝茶嗑瓜子
            }

        });

注意super,调用父类的方法。
打印如下:
这里写图片描述

第三章:校长回来了

校长发现,效果并不好,学生还是很皮,于是,校长又另请高明,既不是教导处主任,也不是班主任,是一个新的角色,他叫robin,擅长用皮鞭,怎么写?
首先肯定是要有一个校长的同意,所以需要创建一个校长对象

XiaoZhang xz = new XiaoZhang();// 创建一个校长
xz.setmDoJobCallBack("robin", "皮鞭", new DoJob() {//注意这个地方是DoJob

            public void talk(String teacherName) {
                // TODO Auto-generated method stub
                System.out.println(teacherName + " 和我谈话了");
            }

            public void fuck(String teacherName, String tool) {
                // TODO Auto-generated method stub
                System.out.println("艾妈,我被 " + teacherName + " 用 " + tool
                        + " 打了");
            }
        });

log:
这里写图片描述

完结。

最后让我们再来审视一下,开头我提出来的

回调就是我不知道你调用这个 具体 干嘛,但是我知道你 大概 要干什么。

校长让座这个管理学生的工作,校长不知道具体是谁来做,怎么做,但是校长知道管学生有说和打两种方式。这个 说 和 打 就是所谓的 回调函数

你以为结束了?看看右边滚动条吧,孩子。这是开始,前面都是铺垫。(Java程序员适当翻看下面内容。)
问题来了,回调有个J8用?

最早开始,大家都知道我请求网络数据,一般都有两个回调方法
onSuccess
onFailed
没错,我就是用xUtils长大的。
上网查阅资料之后,这里用到的网络回调伪代码大概如下:

public static void sendHttpRequest(final String address,
            final HttpCallbackListener listener) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                HttpURLConnection connection = null;
                try {
                ...//这里用HttpUrlConnection取到数据
                    while ((line = reader.readLine()) != null) {//流转换,得到字符串
                        response.append(line);
                    }
                    if (listener != null) {
                        // 回调onSuccess()方法,携带数据
                        listener.onSuccess(response.toString());
                    }
                } catch (Exception e) {
                    if (listener != null) {
                        // 回调onFailed()方法,携带报错信息
                        listener.onFailed(e);
                    }
                } finally {
                    if (connection != null) {
                        connection.disconnect();
                    }
                }
            }
        }).start();
    }

我之前也是似懂非懂,现在感觉明白了不少。

你以为完了?
android用到了很多回调机制,比如按钮的点击事件、线程的run()方法
下面开始讲Android里面的回调机制。
这篇文章不错,我引用一下,作者不要打我

里面说到这两个例子
1. 给RecyclerView的item添加点击事件

public class ClickAdapter extends RecyclerView.Adapter{
    //定义接口实例
    private OnClickItemListener mOnClickItemListener;

    //设置接口实例的setter方法
    public void setOnClickItemListener(OnClickItemListener onClickItemListener) {
        mOnClickItemListener = onClickItemListener;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { . . . }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) { . . . }

    @Override
    public int getItemCount() { . . . }

    public class ViewHolder extends RecyclerView.ViewHolder{
        // ...
        // 视图控件初始化
        public ViewHolder(View itemView) { . . . }
        /*绑定视图方法,在Adapter的onBindViewHolder中调用*/
        public void bindHolder(final String text) {
            mTextView.setText(text);
            if (null != mOnClickItemListener) {
                itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        //在点击事件中进行回调
                        mOnClickItemListener.onClick(text);
                    }
                });
            }
        }
    }
    //创建内部接口
    interface OnClickItemListener{
        void onClick(String text);
    }
}

所以,接口回调可以总结为以下4步:

  • 创建内部接口
  • 定义接口实例
  • 设置接口实例的setter方法
  • 在点击事件中进行回调

2.用子线程加载网络图片,并显示在主线程中

public class ImageUtil {
    public static void loadeIamge(final String url, final LoadeImageListener listener) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                InputStream is = null;
                BufferedInputStream bis = null;
                try {
                    HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
                    connection.setConnectTimeout(5000);
                    connection.connect();
                    is = connection.getInputStream();
                    bis = new BufferedInputStream(is);
                    //拿到bitmap,通知(调用)onLoadeImageListener。
                    listener.onLoadeImageListener(BitmapFactory.decodeStream(bis));
                } catch (Exception e) {
                    e.printStackTrace();
                }finally {
                    CloseUtil.closeQuietly(is);
                    CloseUtil.closeQuietly(bis);
                }
            }
        }).start();
    }
    public interface LoadeImageListener {
         void onLoadeImageListener(Bitmap bitmap);
     }
}

上面的代码就是一个加载网络图片的工具类,可以发现在这里,没有定义接口实例,也没有定义接口实例的setter方法,而是直接用调用者那里传来的接口实例进行操作。

下面来看看调用者的实现:

final ImageView imageView = (ImageView) findViewById(R.id.image_view);
       ImageUtil.loadeIamge(IMG_URL, new ImageUtil.LoadeImageListener() {
           @Override
           public void onLoadeImageListener(Bitmap bitmap) {
               imageView.setImageBitmap(bitmap);
           }
       });

完。
。
。
。
。
。
。
。
。
。
。
。
这下真的没了。。

你需要做的是点个赞,谢谢,我要打dota去了。

.NET 回调、接口回调、 委托 如果Controller类接收的是一个抽象的接口变量Iback,则任何实现了该接口的对象都可以被Controller类对象所回调,Controller类的代码就再不用被修改,保证了代码对环境的适应性,无疑是一个很好的解决方案。这个被调用方法的对象称为回调对象。可以看到,当示例程序运行时,何时调用CallBack对象的run()方法是由用户决定的,用户每敲一个键,控制器对象就调用一次CallBack的run()方法。首先创建一个回调对象,然后再创建一个控制器对象,将回调对象需要被调用的方法告诉控制器对象。.. 阅读详情

相关推荐

Fuck this website

GO and fuck yourself

Finally,the fucking exam is over...

   FU*&^&%^(*&^^*&^%&K..................I dont know how bad it is,maybe there will be  three subject that I need to make-up exam next term...and there has one i know,practical write has fail...and tw

Non_Recursive's Home 2300

C#极域电子教室 分分钟干掉老师 FuckTeacher

C#极域电子教室 分分钟干掉老师 文件名:FuckTeacher.rar

meta-tracing 与 JIT:解释器如何通过 trace 实现即时编译

动态语言虚拟机往往受限于解释执行的低效率,即时编译(JIT)因此成为提升运行时性能的关键路径。按编译单元来看,JIT 可分为方法级与追踪式两类:方法级 JIT 以函数整体为处理对象,追踪式 JIT 则记录程序实际执行过的一段连续指令序列,即 trace。meta-tracing 则将“追踪记录、优化、生成机器码”从具体语言中抽象出来,让普通解释器也能适配一套 JIT 运行时,yk meta-tracing system 正是这一方向的实验项目。其核心机制是:在解释器主循环中识别热点回边,记录带类型 guar

weixin_34289454的博客 626

fu*kteacher工具

该工具用于退出极域电子教室,隐藏控制画面。完美的极域退出工具。

解除教室老师电脑控制

解除教室老师电脑控制

Android回调机制浅析

编程工作的层次可以分为系统编程和应用编程: 系统编程(system programming):写库方法,API 应用编程(application programming):调用API实现功能 系统和应用怎么统一起来实现一个功能呢?可以有三种机制来完成,同步机制,异步机制和回调机制。 本文主要讨论的是回调机制。   回调概述       一般的正向代码流程的都是是应用调用API中的

无敌麦子地的博客 2450

MythWareWindow-Min:极域电子教室最小化源码_E语言

神话之窗 极域电子教室最小化源码_E语言 没有做一些流程控制,只是一个很小的demo

浅析JavaScript回调

浅析JavaScript回调与异步 什么是回调 在谈"什么是回调"之前,我们先来看看什么是回调函数。

qq_20145515的博客 569

中国1990-2021连续30年土地利用CLCD数据分享

CLCD(China Land Cover Dataset)数据集是由武汉大学黄昕老师基于Google Earth Engine上的335,709景Landsat数据制作的中国年度土地覆盖数据集。为了提高CLCD的时空一致性,还提出了一种包含时空滤波和逻辑推理的后处理方法。该数据集最大的优势在于每年30米的土地利用分类结果,且连续覆盖了30年时间。相比其他产品如GLC_FCS30、Global30、AGLC2000_2015、FROM-GLC10、ESA10、ESRI10等,CLCD在时间分辨率上更高。

qq_48539301的博客 1万+

C#程序突然崩溃怎么办?5分钟学会分析Dump文件(Visual Studio 2022实战)

本文详细介绍了在C#程序崩溃或无响应时,如何捕获并分析Dump文件以快速定位问题。通过Visual Studio 2022实战演示,重点讲解了配置符号服务器、解读调用堆栈与内存状态,以及针对CPU飙高、内存泄漏等典型场景的分析方法,帮助开发者高效进行故障诊断。

docker8compose的博客 474

JAVA与Android接口回调浅析;

首先 A类   B类两个类 一个接口C构成我们的接口回调.(能够传递数据能够调用方法).当然也有其他写法 但是本质都是一个道理. A类实现接口C. B 类调用接口C  (注意实现与调用)  实现就是Implement    调用就是得到这个接口对象并处理. 关键点来了;因为我们A类实现了接口C,就成了C类的实现类,故B类调用接口时候可以将此接口就看作是A类 ;所以我们执行B类中对应的方法到了一

693的专栏 472

域控制器开发避坑实录:从硬件设计到软件集成的5个关键挑战

本文深入剖析了域控制器开发中的5大关键挑战,从硬件选型到软件集成,涵盖智能驾驶芯片选择、实时性优化、AUTOSAR架构适配等核心问题。通过实战案例和数据对比,为工程师提供避坑指南,助力提升开发效率和系统可靠性。

weixin_29258297的博客 396

浅析 回调函数

在介绍回调函数之前,先介绍一下函数的指针函数指针,顾名思义,它指向一个函数的入口地址,其定义及使用如下:     定义:returntype     (*ptr)               (typename   variable,......)              返回类型      (*指针名称)         指向函数的参数表。     你不能这样:     returntyp

csw_100的专栏 624

基于fMRI数据计算脑脊液(CSF)与全脑BOLD信号的时间耦合分析

BOLD和CSF信号有多相似CSF信号要延迟多少时间才能最匹配BOLD信号BOLD-CSF的互相关公式lag:时间延迟采样点数BOLD信号CSF信号延迟时间点对应的相关系数。

Rose9614的博客 2983

指纹对抗指南:如何绕过Cloudflare与Akamai的5s盾与浏览器指纹检测

现在的CDN反爬技术虽然越来越强,但是道高一尺魔高一丈,只要掌握了指纹伪造、流量伪装、行为模拟这些核心技术,就可以绕过绝大多数的防护措施。对抗过程中要注意效率和成本的平衡,小规模爬取用Playwright+stealth最方便,大规模爬取用curl_cffi+代理池性价比最高,遇到验证码用打码平台或者自动识别服务,不需要死磕破解。本文介绍的方案已经在实战中验证过,可以绕过95%以上的Cloudflare/Akamai防护,成功率非常高。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 299

浅析Vue 中 $nextTick 机制

nextTick 出现的前提 因为Vue是异步驱动视图更新数据的,即当我们在事件中修改数据时,视图并不会即时的更新,而是等在同一事件循环的所有数据变化完成后,再进行视图更新。类似于Event Loop事件循环机制。 官方介绍 首先我们看下官网给出的介绍: Vue.nextTick([callback, context]) 参数: {Function} [callback] {Object} ...

weixin_34008784的博客 277

【数字孪生与仿真技术】10:半导体制造中的虚拟量测技术深度解析:从多尺度建模到工业级应用

摘要:半导体制造过程中,晶圆加工需实时监测300+关键参数,传统物理量测技术面临产能损耗、延迟检测等痛点。本文系统阐述虚拟量测(Virtual Metrology)技术的完整解决方案,通过多尺度混合建模实现物理机理与数据驱动的深度融合。内容涵盖等离子体刻蚀、薄膜沉积等关键工艺的物理模型构建,LSTM神经网络的数据校正算法,以及边缘-云协同的实时部署架构。某12英寸晶圆厂实践表明,虚拟量测技术可减少70%物理量测频次,异常漏检率从18%降至3%,机台利用率提升11%。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2556

浅析微信支付:支付结果通知

本文是【浅析微信支付】系列文章的第六篇,主要讲解支付成功后,微信回调商户支付结果通知的处理。 浅析微信支付系列已经更新五篇了哟~,没有看过的朋友们可以看一下哦。 浅析微信支付:统一下单接口 浅析微信支付:微信公众号网页授权 浅析微信支付:开发前的准备 前面一章已经讲了如何调用统一下单接口和调起微信支付窗口,在调用下单接口时,我们会传入 异步接收微信支付结果通知的回调地址,顾名思义这个地址作用...

YClimb的专栏 7651

ICC2 user guide(二)Placement and Optimization

ICC2 place阶段user guide

m0_61544122的博客 9228

Android Update Engine 分析(三四)OTA 签名都支持哪些算法?

写了几十篇还没涉及到 OTA 签名算法细节,OTA 讨论群也很少问这个,毕竟签名算法纯理论的问题,一旦实现好就极少需要改动,只需要进行一些配置,准备好签名的秘钥和证书就可以了。限于签名的算法理论太过于抽象,本篇不讨论签名算法细节,但会总结一些签名操作。以及 Android OTA 包支持的签名算法。本文主要分析 Update Engine 中支持的签名算法,以及这些算法的操作实现(不涉及原理部分),并总结签名和验签使用的 key。

洛奇看世界 716

Android中消息机制:Handler机制源码浅析

Android中的消息机制一直都是新手头疼的问题,对于Handler机制的理解是Android重中之重,经常在面试和日常开发中遇到,所以,这篇文章目的是通过解析源码来帮助梳理Handler的工作机制和运行流程。

Geek的博客 506

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Qt整体框架浅析(二) -信号机制

    这一章主要来讨论一下建立在meta-object system 上的信号机制( signals and slots )。    下边简要介绍一下信号机制是如何运作,以及采用信号机制的原因。     如下图所示,信号与槽是多对多的关系,通过connect将信号与槽链接在一起,这样的对应关系维护了指定的函数参数,信号emit后就不再关心是谁来处理,这个是一个单向的过程,不过槽函数可

古朴匠心 3259

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

android intrface回调,Android中回调接口的使用介绍

MainActivity如下:复制代码 代码如下:package cn.testcallback;import android.os.Bundle;import android.widget.Toast;import android.app.Activity;/*** Demo描述:* Android中回调接口的使用*/public class MainActivity extends Activ...

weixin_42350014的博客 168

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

浅析UITableView的Cell复用机制 dequeueReusableCell

前言: 在承载大容量条目信息时,UITableView(或UICollectionView)的复用机制扮演者不可或缺的角色。iOS自动地为我们将cell从cell队列里入队和出队操作,本文将浅析这一机制。 创建cell的方法: 在实现了UITableViewDataSource这一协议后,回调方法 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell内我们可以进行

kicinio的博客 1740

tornado异步机制浅析

前言真是无言以对啊这篇文章原本是12号发布,本准今晚在记录些什么,结果mac打开csdn点击新写文章,出来上次写的这篇博文内容,反复几次都是,以为是上次缓存,随手清除,结果是上次博文内容被清空了。说不清是什么问题,那就凭记忆重现吧。 资源演示环境是在ubuntu下(原始12号的文章是在mac上演示,为了重写改在ubuntu重现,但是却发生不一样的情况。) 所用python版本为 3.4.2 本文

wushirenfei的博客 2477
上一篇: Eventbus3.0入(踩)门(坑)之旅
DreamCarMustang
博客等级 码龄12年 10粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值