关于Callback回调,传递参数

关于Callback回调,传递参数

标签(空格分隔):CSDN



在实现网络通信的时候学习人家的代码注意到了这种的Callback,当然使用的格式什么的也不是上一篇文章上的

代码注释较少,谅解
,上一种回调主要是为了调用方法,而这一种实现主要是为了传递参数

第一种情况

class A实现了一个接口
class A 有一个class B的引用
class B有一个以class 实现的接口为参数的方法
通过class B的对象调用class B的方法,使用接口作为参数时就可以传入class A的对象引用,就可以在这个方法中调用class A的其他方法

Talk is cheap,show me the caode

Method.java

public class Method {
    private String string;

    public Method(String string, SucessCallback sucessCallback, FailCallback failCallback) {
        this.string = string;
        if (sucessCallback != null) {

            sucessCallback.onSucess(string);
        } else {
            failCallback.onFail();
        }
    }

    public interface SucessCallback {
        void onSucess(String string);
    }

    public interface FailCallback {
        void onFail();
    }
}

代码简单,可以看出该类持有两个接口,一个成功的,一个是失败的。然后在构造方法中也是使用了内部接口的实例引用。实例不为空的话就调用实例的方法。其实这里的sucessCallback.onSucess(result)只是规定了方法中的动作。这里的successCallback在运行的时候就是

    new Method.SucessCallback() {
        public void onSucess(String string) {
            // TODO Auto-generated method stub
            System.out.println(string);
        }
    }

没错,就是这一坨。就是这个实例,然后他要调用onSucess()方法,然而匿名的,这个方法在他内部被实现了,于是;result就进入了方法内部,就完成了数据的传递。

TestMethod.java

public class TestMethod {


    public static void main(String[] args) {
        new Method("这是什么回调?", new Method.SucessCallback() {

            public void onSucess(String string) {
                // TODO Auto-generated method stub
                System.out.println(string);
            }
        }, new Method.FailCallback() {

            public void onFail() {
                // TODO Auto-generated method stub

            }
        });
    }

}

这里使用匿名的形式产生一个接口的实例。

与上面等效的TestMethod.java

public class TestMethod {
    class A implements SucessCallback {

        public void onSucess(String string) {
            // TODO Auto-generated method stub
            System.out.println(string);
        }

    }

    class B implements FailCallback {

        public void onFail() {
            // TODO Auto-generated method stub

        }

    }

    public static void main(String[] args) {

        TestMethod test = new TestMethod();
        TestMethod.A a = test.new A();
        TestMethod.B b = test.new B();

        new Method("这是什么回调?", a, b);

    }

}

这样一改就水落石出了。接口,实现,以接口为参数的方法,传入实现了接口的类的实例,都有了。如果把Method看作类B的话,类B中的以接口为参数的方法就是这个构造方法了。而假如TestMethod就是类A,那么类B的引用及创建对象的过程就集中在使用了匿名创建Method类对象的过程上了。一切是那么的自然,随意。
主要是这里接口摆放的位置很是奇怪,不是经常见到的那样。而是直接放在了类B中。当然也可以放在其他地方。主要目的就是通过实现接口方法来进行参数的传递


再来一种情况

Method.java

public class Method {
    private String string;

    public void fun(String string, SucessCallback sucessCallback, FailCallback failCallback) {
        this.string = string;
        if (sucessCallback != null) {
            sucessCallback.onSucess(string);
        } else {
            failCallback.onFail();
        }
    }

    public String fun1(String string1, SucessCallback sucessCallback, FailCallback failCallback) {
        if (string.equals(string1)) {
            return "The two strings are equal";
        } else {
            string = string1;
        }
        if (sucessCallback != null) {
            sucessCallback.onSucess(string);
        }
        else {
            failCallback.onFail();
        }
        return null;
    }

    public interface SucessCallback {
        void onSucess(String string);
    }

    public interface FailCallback {
        void onFail();
    }
}

TestMethod.java

public class TestMethod {

    public static void main(String[] args) {

        Method method = new Method();
        method.fun("This is right", new Method.SucessCallback() {

            public void onSucess(String string) {
                // TODO Auto-generated method stub
                System.out.println(string);
            }
        }, new Method.FailCallback() {

            public void onFail() {
                // TODO Auto-generated method stub

            }
        });
        String string = method.fun1("This is right", new Method.SucessCallback() {

            public void onSucess(String string) {
                // TODO Auto-generated method stub
                System.out.println("Callback:" + string);
            }
        }, new Method.FailCallback() {

            public void onFail() {
                // TODO Auto-generated method stub

            }
        });
        System.out.println("The fun result:" + string);
        String string1 = method.fun1("This is not right", new Method.SucessCallback() {

            public void onSucess(String string) {
                // TODO Auto-generated method stub
                System.out.println("Callback1:" + string);
            }
        }, new Method.FailCallback() {

            public void onFail() {
                // TODO Auto-generated method stub

            }
        });

        System.out.println("The fun1 result:" + string1);
    }

}

这个就是比较标准的在方法中有接口的实例,只是接口放的地方还是有点不一样。

国际惯例:总结

虽然耗费了点时间,但是这是我自己测试,一点一点的思考,拿到人家的代码分析。我爱一个人坐在这里,加油,没有目的地,不停的前行。努力到感动自己!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值