最近在啃设计模式,所以会注意到一些架构化的设计,接口回调与回调函数也是在项目中结合网上的一些Java接口回调与回调函数的文章抽出来总结的。
接口回调
接口回调是指:可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称为对象功能的接口回调。
interface People{ void peopleList(); }class Student implements People{ public void peopleList(){ System.out.println("I’m a student."); } }class Teacher implements People{ public void peopleList(){ System.out.println("I’m a teacher."); } }public class Example{ public static void main(String args[]){ People a; //声明接口变量 a=new Student(); //实例化,接口变量中存放对象的引用 a.peopleList(); //接口回调 a=new Teacher(); //实例化,接口变量中存放对象的引用 a.peopleList(); //接口回调 } }
有点抽象?其实直接这么理解就行了:
接口 a =new 实例化接口的对象();
这在设计模式中也是经常用到的,这也是面向对象的一大精髓 -> 面向接口的一个做法,面向接口能够给代码带来更多的解耦,结合设计模式使用能发挥更大作用,面向接口的好处在这里也不多详述了。
回调函数
回调函数的过程如图所示,
关于回调函数,有个不错的例子,摘自里面的一段解释:
所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法
在Android里边比较不错的例子是
mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //TODO:events } });
其中,onClick(View view)
就是回调函数,这个流程是这样的:
在当前类中调用了View类的setOnClickListener()
方法,而View类反过来调用了当前类的onClick(View view)
原理就是这样,至于Android源码是怎么回调这个onClick(View view)
的,可以去看看Android的官方源码
在Android中用接口实现回调函数的等价功能
这是我在使用recycleview中,加载更多时用到的。需求是这样的,在主界面
底部有个点击重新加载之后变为第二张图,那么怎么做的呢,结合回调接口,首先写好一个接口类
public interface LoadMoreDataAgainListener { void loadMoreDataAgain(TextView textView, View loadingView); }
接着RecyclerView的Adapter写好创建监听器的方法
public void setOnMoreDataLoadAgainListener(LoadMoreDataAgainListener onMoreDataLoadAgainListener) { mLoadMoreDataAgainListener = onMoreDataLoadAgainListener; }
在RecyclerView.ViewHolder中view的监听器:
@OnClick({R.id.loadingIndicatorView, R.id.tv_load_data_again})public void onClick(View view) { mLoadMoreDataAgainListener.loadMoreDataAgain(mTvLoadDataAgain, mAvLoadingIndicatorView); }
在fragment类中为adapter传递该监听器:
private AddFooterBaseAdapter mAddFooterBaseAdapter; mAddFooterBaseAdapter.setOnMoreDataLoadAgainListener(new LoadMoreDataAgainListener() { @Override public void loadMoreDataAgain(TextView textView, View loadingView) { textView.setVisibility(View.GONE); loadingView.setVisibility(View.VISIBLE); //TODO:加载更多数据 } });
至此,一个接口实现回调函数的等价功能就实现了