头疼,看了一下午的java回调机制,不敢说懂了,只能说懂了怎么用,不过还有些问题,有想法的望大家多多指教。
举个例子理解下回调:
1、什么是回调
回调其实是一种双向调用模式,也就说调用方在接口被调用时也会调用对方的接口,听起来就很拗口,翻译翻译就是“实现了抽象类/接口 的实例实现了父类的提供的抽象方法后,将该方法交还给父类来处理”,主要要弄清楚一点,实现方法交还给提供接口的父类处理!
2、为什么要用回调
我们需要将普通物体的特性抽象出来,共性之中又有特性,每个不同的特性就需要交给特定的情况处理,通过暴露接口方法可以减少很多重复,代码更加优雅。
3、举个例子
我们知道,一般情况下主线程是不执行耗时任务的,如果遇到一些耗时任务(如网络请求,文件读写,数据库读写等等),我们会将其放入子线程中去执行,当执行完毕后,子线程再将执行结果返回给主线程。这个过程就是回调。
4、具体代码示范:
public class Fragment_shouye extends Fragment implements OnClickListener {
【定义接口】 在类中定义一个Interface, 并在接口中定义一个抽象方法
//定义一个ZXQT接口
public abstract interface ZXQT{
public abstract void onhide(int k);
}
【接口对象】在类中定义一个该接口的成员变量
//定义一个ZXQT接口类的对象
ZXQT zxqt;
}
private void initView() {
【设置对象】在类中定义一个公共方法,可以设置这个接口的对象,调用该方法给接口对象变量赋值,人家都是注释里面这么写的。
/*
* *public void setCallback(Callback callback) {
* * this.mCallback = callback;
* * }
*/
//用(ZXQT)getActivity()方式竟然可以实现,我不太懂奥。
zxqt=(ZXQT)getActivity();
}
然后我在下面的地方调用了这个方法。
zxqt.onhide(1);
在这个类的方法中实现了接口函数的具体方法
@Override
public void onhide(int k) {
// TODO Auto-generated method stub
if(k==1){
LinearLayout imageView_back = (LinearLayout) this.findViewById(R.id.main_bottom);
imageView_back.setVisibility(View.INVISIBLE);
View line = (View) this.findViewById(R.id.line);
line.setVisibility(View.INVISIBLE);
}
}
有一篇简书文档中理解的特别到位:
所谓的回调函数就是:在A类中定义了一个方法,这个方法中用到了一个接口和该接口中的抽象方法,但是抽象方法没有具体的实现,需要B类去实现,B类实现该方法后,它本身不会去调用该方法,而是传递给A类,供A类去调用,这种机制就称为回调。
http://www.jianshu.com/p/3f86b7949f20
具体参考博客:
http://blog.youkuaiyun.com/xsf50717/article/details/50520462
http://blog.youkuaiyun.com/xiaanming/article/details/8703708/