关于Callback回调,传递参数
标签(空格分隔):优快云
在实现网络通信的时候学习人家的代码注意到了这种的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);
}
}
这个就是比较标准的在方法中有接口的实例,只是接口放的地方还是有点不一样。
国际惯例:总结
虽然耗费了点时间,但是这是我自己测试,一点一点的思考,拿到人家的代码分析。我爱一个人坐在这里,加油,没有目的地,不停的前行。努力到感动自己!!!