相信刚进入android开发的朋友总是会听到接口回调什么的,其实吧,这个东西很好理解,只是你可能是被回调这个名词和它的解释给搞迷糊了。我自己属于半路出家的,一开始学习这个东西的时候也很恐惧,感觉哇塞,好复杂云里雾里的感觉。后来慢慢自己发现很多东西吧,别想的那么复杂,追本溯源即可。
首先得明确回调的本质其实是就是一个接口。那接口又是用来干什么的呢?接口是用来扩展程序的!很多东西我喜欢用类比法来学习,我觉得更容易理解。生活中有很多接口的案例,比如说:笔记本对外提供USB接口,你可以连鼠标,键盘,USB灯,电扇等,但是笔记本并不需要知道你拿USB接口干什么,它只需要暴露接口并且连接好线路,静静地等你来连接。Android中有个最常见的接口回调案例,就是View.setOnclickListener();方法,需要传入一个实现了onClickListener接口的实例参数。其实View它只是对外暴露了OnClickListener接口,里面有一个等待别人实现的onClick()方法。**再次重复为什么接口是用来扩展程序的,因为接口里提供的方法是等待着别人来实现的!**View类说了:点击我的时候,我会调用onClick()方法,但是我就是自己不实现,嘿嘿嘿,一切等着别人来帮我做,岂不是美滋滋。这个时候一般主Activity中的Button会有这样的代码:
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //我特么被点击了 }}); 主Activity再把实现了接口实例的参传当作参数传递给View类,供其使用。妈的,一顿分析下来,感觉提供接口的View类就相当于生活中的公子哥一样,张嘴不动手的主,麻痹,张嘴就是“晚上要吃饺子”就是不动手,等老妈主Activity去实现好煮饺子的方法,到点了就去吃,感觉贼气。
按理说接口是不能实例化的,就是说是不能new的。上面的那种new View.OnClickListener其实是一种匿名内部类的写法,是一种简写,把类名隐藏了,其实他是这样的:
button.setOnClickListener(new A());class A implements View.OnClickListener{ @Override public void onClick(View v) { //我特么被点击了 } } 所以呢,完整说法是传入一个实现了View.OnClickListener接口的类的对象参数。就像小时候,数学做应用题,老师说按步骤列式子好理解,有的熊孩子就喜欢弄一整式你说气人不?
新闻热点
疑难解答