接口回调机制
网上有一篇挺形象的例子 https://www.cnblogs.com/heshu...
java中的回调我认为分为,同步回调,异步回调
回调:其实就是,A调用B,B也调用A,
同步回调:就是一种阻塞调用,A调用B的方法,等待B执行完,A才继续
异步回调:类似打电话,A告诉B一声,然后A,B 各自干各自的事情。
异步回调又可以是多线程,也可以是接口,我都按照异步来理解了。下面说的是接口回调的理解,比较常用
1、什么是回调函数
有些库函数(library function)要求应用先传给它一个函数,在合适的时候调用,以完成目标任务。这个被传入的、后又被调用的函数就称为回调函数(callback function)就是:我找你帮忙help做一件事,我把做完应该干啥的方法do()传给你,,然后我调用请求你help()方法,告诉你开始做吧,然后你做了一堆,最后做完了应该怎么办,就是调用do();
2、上面链接中例子的理解
上文中的接口回调,理解为异步回调,就是我想完成一件事,我不用自己做,我告诉别人一下,让他去做,我自己可以去做别的事。
约定接口,计算完要做的事----这里就是填写结果,具体填写谁的? 填什么?怎么填,都是传过来的。。。 谁要找我帮忙,你得给我传个你得权限和信息,比如(我帮你填写结果,你告诉我怎么填,就是接口中这个方法,方法的具体实现规则是由 对方来完成)
public interface doJob
{
public void fillBlank(int a, int b, int result);
}
计算方法,根据传过来的值和对象,计算,计算完并根据约定,调用接口的方法做操作。
public class SuperCalculator
{
public void add(int a, int b, doJob customer)
{
int result = a + b;
customer.fillBlank(a, b, result);
}
}
学生,找人帮忙计算,把数值 和 约定的实现方法传过去,告诉他,这几个数,你给我计算,计算完按照我的方法给我填了
public class Student
{
private String name = null;
public Student(String name)
{
// TODO Auto-generated constructor stub
this.name = name;
}
public void setName(String name)
{
this.name = name;
}
public class doHomeWork implements doJob
{
@Override
public void fillBlank(int a, int b, int result)
{
// TODO Auto-generated method stub
System.out.println(name + "求助小红计算:" + a + " + " + b + " = " + result);
}
}
public void callHelp (int a, int b)
{
new SuperCalculator().add(a, b, new doHomeWork());
}
}
小贩,找人帮忙,告诉你数值和,具体计算完应该怎么写的方法,计算完按照这个方法帮我填了
public class Seller
{
private String name = null;
public Seller(String name)
{
// TODO Auto-generated constructor stub
this.name = name;
}
public void setName(String name)
{
this.name = name;
}
public class doHomeWork implements doJob
{
@Override
public void fillBlank(int a, int b, int result)
{
// TODO Auto-generated method stub
System.out.println(name + "求助小红算账:" + a + " + " + b + " = " + result + "元");
}
}
public void callHelp (int a, int b)
{
new SuperCalculator().add(a, b, new doHomeWork());
}
}
public class Test
{
public static void main(String[] args)
{
int a = 56;
int b = 31;
int c = 26497;
int d = 11256;
Student s1 = new Student("小明");
Seller s2 = new Seller("老婆婆");
s1.callHelp(a, b);
s2.callHelp(c, d);
}
}
所谓回调,就是a调b,b也会调a
最后的结果是: 学生给了你数值,和怎么填写,,然后你计算完,用学生的对象调用了下方法,把数值传进去,填写。这是所谓的回调,具体我怎么填写的,这个方法时学生是写约定接口自己实现的,他传过来了,告诉你了,所以调用方法以后,按照你传入的数值做了回调,实现了学生约定的操作。
3、android中接口回调的使用和理解
举个例子:比如recyclerview 的点击事件,,如果我想在外层做点击事件,这个时候就必须拿到点击的id.但是 recyclerview的点击事件实在 adapter中实现的。。所以可以用接口回调来实现,把点击位置回调返回,在外层做操作。。
但是我们可以这样理解:我要在外层做点击事件,但我做不了,怎么办?我请求内层帮我做,我告诉他我点击了要做啥就行了。这样我属于异步回调,我就是告诉你一声,然后我就该干嘛干嘛去了。
1、请求帮助,需要一个帮助方法让我来调用,我要传值为(我要点击后做的事,传一个对象过去)
2、所以这就需要定义一个接口,约定好方法,然后再内层创建这个帮助方法
3、然后就是内层按照我的要求,去做相应的点击事件了。
所以,接下来我们一步步的去实现:
1、约定一个接口(实现一个点击方法,具体怎么实现由外层决定,完成后传过来)
public interface onMyClick{
void setMyclick(int position);
//有个位置参数,是因为外层实现这个方法规则的时候要用到
}
2、adapter中定义一个 设置监听的方法让外层调用
//声明onMyclick对象是因为接下来,外层调用了这个方法我要用传过来的onMyClick去做操作,去调用setMyclick(),来实现定义的具体操作
onMyClick onMyClick;
public void setOnMyClick(onMyClick onMyClick){
this.onMyClick =onMyClick;
}
3、外部调用监听方法,传入操作规则,也就是实现定义的接口方法的具体
adapter.setOnMyClick(new MyAdapter.onMyClick() {
@Override
public void setMyclick(int position) {
Log.d("测试","接口回调");
}
});
4、adapter内部点击事件的监听
holder.view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("测试","正常点击事件");
if (onMyClick!=null){
onMyClick.setMyclick(position);
}
}
});
注意:上面的顺序是我按照理解的过程写的,写的时候顺序不一定是这样。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。