Java回调与反复

什么是回调?##

先举个通俗易懂的例子
经理要出差,给某个员工安排了任务(挖了个坑就不管了,员工你去填坑。这个坑就是回调),临走前吩咐,任务做完了记得通知我.
定义回调规范CallBack

/**
 * 约定一个消息(经理留下手机号码),员工做好了,打电话给经理。经理才知道
 * @author afei
 * 
 */
public interface CallBack {
    /**
     * 
     * @param feedback 员工做好后,得通知经理
     */
    void callback(String feedback);
}

Manager

/**
 * 实现回调规范(我跟员工的约定,他做好了打电话通知我)
 * 我这里实现callback就是把手机带上。要不然员工上哪儿通知我。
 * @author afei
 *
 */
public class Manager implements CallBack {

    /**
     * 经理接到员工的电话,收到消息
     */
    @Override
    public void callback(String feedback) {
        System.out.println("给我的反馈信息是:" + feedback);
    }

}

定义一个调用类

public class Afei {
    /**
     *  
     * @param callback 就是做好了,我得通知经理啊(比如给打打电话,发邮件etc...
     * 临走前,经理留下了电话号码。我做好了,就骚扰他)
     */
    void doTask(CallBack callback) {
        String msg = "我做好了";
        callback.callback(msg);
    }

}

测试

public class Client {

    public static void main(String[] args) {
        //员工做经理给的任务
        new Afei().doTask(new Manager());
    }
}

输出
给我的反馈信息是:我做好了

不知各位看官理解没有,没有的话,再来一个Android开发的例子。基本模拟activity调用过程,当然,实际情况复杂多了。。。

/**
 * 定义回调
 * @author afei
 *
 */
public abstract class Activity {

    abstract void onCreate(Map<String, String> bundle);
}
/**
 * 定义回调调用者
 * @author afei
 *
 */
public class OS {
    static Map<String, String> bundle;
    
    static {
        bundle = new HashMap<String, String>();
    }

    void performCreate(Activity activity) {
        bundle.put("createdMsg", "the bundle be created by OS");
        activity.onCreate(bundle);
    }

}
/**
 * 模拟系统调用入口
 * @author afei
 *
 */
public class Client {
    public static void main(String[] args) {
        new OS().performCreate(new OneActivity());
    }
}

Android开发者

/**
 * 使用回调,开发人员填充代码
 * @author afei
 *
 */
public class OneActivity extends Activity {

    @Override
    void onCreate(Map<String, String> savedInstanceState) {
        System.out.println("实例化布局,并且使用系统实例化的变量:" + savedInstanceState);
    }

}

运行Client.main()方法,输出
实例化布局,并且使用系统实例化的变量:{createdMsg=the bundle be created by OS}

看到这里的同鞋maybe会问道,你怎么知道activity是怎么调用的?
下面我们来测试一下Android系统activity调用过程

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        try {
            throw new Exception("MY_EXCEPTION");
        } catch (Exception e) {
            e.printStackTrace();//使用该方法,可以清晰的知道方法之间的调用关系
        }
    }
}
activity-call.png
preformCreate.png
callActivityOnCreate.png
ActivityThread.main.png

来自知乎https://www.zhihu.com/question/20284432

Android应用程序的入口点是什么?ActivityThread?onCreate?
是一个搞 Android 开发的朋友,面试的时候被问一个"Android应用程序的入口点是什么?"
他回答ActivityThread,结果面试的人一脸茫然;他再说onCreate,面试官就”说这就对了嘛”

summary##

现在再来总结回调,Java代码的回调函数经常由框架或是系统定义,由程序开发人员填充。回调函数包含:
调用者:如dbutils中的QueryRunner。
回调规范:即一个接口,如dbutils中的ResultSetHandler<T>。其中可以定义N多个它的子类。
返回的数据:由用户自己定义,或是系统已经定义。

/**
 * 定义回调规范
 */
public interface Protocol<T> {
    /**
     * @param val 留着回调使用
     * @return
     */
    public  T obj(int val);
}
/**
 * 定义调用者
 */
public class Runner {

    /**
     *
     * @param customNum 自定义数字
     * @param protocol 用户实现的接口
     * @param <T> 定义泛型
     * @return
     */
    public <T> List<T> getObjs(int customNum,Protocol<T> protocol){

        List<T>list = new ArrayList<T>();
        for (int i = 0;i< customNum;i++){
            T ret = protocol.obj(i);
            list.add(ret);
        }
        return list;
    }
}
public class Client {

    public static void main(String[] args) {

        Runner runner = new Runner();

//        List<String> objs = runner.getObjs(20, new Protocol<String>() {
//            @Override
//            public String obj(int val) {
//                return "hello" + val;
//            }
//        });
        List<String> num = runner.getObjs(30,(val)->{return "hello"+val;});//lambda
        System.err.println(num);
    }

}

运行Client.main()输出结果
[hello0, hello1, hello2, hello3, hello4, hello5, hello6, hello7, hello8, hello9, hello10, hello11, hello12, hello13, hello14, hello15, hello16, hello17, hello18, hello19, hello20, hello21, hello22, hello23, hello24, hello25, hello26, hello27, hello28, hello29]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,259评论 25 707
  • 晚年乔布斯在一次演讲中总结自己三十年企业生涯之个人经验,提出以下创新及创业理念精髓: 1)你的时间有限,所以不要为...
    风向逆转_92f6阅读 1,536评论 0 1
  • 庆荣弟: 高一时融洽的情绪早已成为过去,而有一种隔膜却在潜滋暗长。我该怎样向你解释,你总是以为我瞧不起你,...
    天行健君马甲阅读 171评论 0 2
  • 如果云知道,又能怎样呢? 我常常想,如果当初我换一个心态面对接下来的四年,如果不是那么迫切的想要离开这个城市,是不...
    阿喵酱阿喵酱阅读 322评论 0 0
  • 忙完了所有的事情终于可以写写日记了,昨天写的日记说了她的坏毛病,也看到家长说的,今天早上我就告诉她跟她约法三章,得...
    若晨_8572阅读 216评论 0 0