Java回调机制的理解

接口回调机制

网上有一篇挺形象的例子 https://www.cnblogs.com/heshuchao/p/5376298.html

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);
                }
            }
        });

注意:上面的顺序是我按照理解的过程写的,写的时候顺序不一定是这样。

猜你喜欢

转载自blog.csdn.net/u011138190/article/details/79777156