Android回调函数的心得

代码是直接抄的简书上的,网址在这里.但是我觉得能更加完善一点.

https://www.jianshu.com/p/7ac60e182449

还看了慕课手记的这篇文章

https://www.imooc.com/article/80310

上简书上的代码:

接口代码:

// 状态变化监听
interface StateChangeListener {
    // 回调方法
    void StateChange(boolean State);
}

开关控件代码:

// 自定义开关--!
class OpenClose {
    // 持有一个接口对象
    StateChangeListener stateChangeListener;

    // 提供注册事件监听的方法
    public void setOnChangeListener(StateChangeListener stateChangeListener) {
        this.stateChangeListener = stateChangeListener;
        //因为是模拟,所以需要在此将控件状态传出
        IsClick(true);
    }
    //是否被点击
    public void IsClick(boolean isClick) {
        // 通过接口对象传控件状态
        stateChangeListener.StateChange(isClick);
    }
}


测试代码:

public class CallBackTest {
    public static void main(String[] args) {

        OpenClose oc = new OpenClose();
        oc.setOnChangeListener(new StateChangeListener() {
            @Override
            public void StateChange(boolean State) {
                if (State) {
                    System.out.println("开");
                } else {
                    System.out.println("关");
                }
            }
        });
    }
}

我觉得能真正的走一遍代码就可以理解的比较透彻了.

我们从main中出发

声明一个OpenClose对象

执行oc的函数setOnChangeListener( 这里传入一个StateChangeListener接口的实现类,它实现了接口的StateChange()函数 )

它只是使用了匿名内部类的形式来实现接口的,一般的实现就是下面这种形式

oc.setOnChangeListener(new StateChangeListener());
class StateChangeListener实现类() implements StateChangeListener{
    @Override
    public void StateChange(boolean State) {
        if (State) {
            System.out.println("开");
        }else {
            System.out.println("关");
            }
    }
}

其实就是传入了一个对象.

但是对于这种setOnChangeListener()方法,我个人有时候就认为跟那种POJO对象的set()方法是一样的,只要带了set的前缀就类似于下面的Java代码,认为就只有一句this.??? = ???.

class Animal{
    string name;
    void setName(String name){
        this.name = name;
    }
}

 ;但是又没有规定带set前缀的方法就只能这样,像回调函数就不同,我在进行this.??? = ???时就还调用???的方法,来执行调用.

我们在看一下上面的代码,为了方便我把代码再次放到下边.

开关控件代码:

// 自定义开关--!
class OpenClose {
    // 持有一个接口对象
    StateChangeListener stateChangeListener;

    // 提供注册事件监听的方法
    public void setOnChangeListener(StateChangeListener stateChangeListener) {
        this.stateChangeListener = stateChangeListener;
        //因为是模拟,所以需要在此将控件状态传出
        IsClick(true);
    }
    //是否被点击
    public void IsClick(boolean isClick) {
        // 通过接口对象传控件状态
        stateChangeListener.StateChange(isClick);
    }
}

注意看这个setOnChangeListener(),除了this.??? = ???;还有一个调用方法,别看它是IsClick(),其实就是一种线性的调用.直观的来看就是下面的代码

// 自定义开关--!
class OpenClose {
    // 持有一个接口对象
    StateChangeListener stateChangeListener;
    boolean isCilck = true;
    // 提供注册事件监听的方法
    public void setOnChangeListener(StateChangeListener stateChangeListener) {
        this.stateChangeListener = stateChangeListener;
        //因为是模拟,所以需要在此将控件状态传出
        stateChangeListener.StateChange(isClick);
    }
    
}

显然,我们又调用了,我们传进来的那个StateChangeListener接口实现类对象的方法StateChange().

那这个StateChange()方法在哪里呢?我再把上面代码拿下来.

测试代码:

public class CallBackTest {
    public static void main(String[] args) {

        OpenClose oc = new OpenClose();
        oc.setOnChangeListener(new StateChangeListener() {
            @Override
            public void StateChange(boolean State) {
                if (State) {
                    System.out.println("开");
                } else {
                    System.out.println("关");
                }
            }
        });
    }
}

我自己画了张图就这样.

不理解上图就看下边

或者你可以这样看!!!!!!!!!!!

测试代码:

public class CallBackTest {
    public static void main(String[] args) {

        OpenClose oc = new OpenClose();
        oc.setOnChangeListener(new StateChangeListener实现类());
    }
}
class StateChangeListener实现类() implements StateChangeListener{
    @Override
    public void StateChange(boolean State) {
        if (State) {
            System.out.println("开");
        }else {
            System.out.println("关");
        }
    }
}

我自己画了张图,就像这样.

从第一种看,程序看起来像从main中到了oc的set,然后又从set到了main的change(),这种一来一回就叫回调.

从第二种看,程序其实就是从main中到了oc的set,然后从set又到了实现类的change(),只是这个实现类是在main中实现的罢了.

总之,别想的太难了,理解理解

发布了94 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_38827988/article/details/103094988