接口回调之简要理解
【背景】在Android中非常多得使用到了接口回调的机制,今天就有幸了解一下,接口回调是怎么回事(简单理解)
接口回调在android中的使用还是蛮多的,记录一下吧,也算是皮毛吧。毕竟,用起来还是很灵活的。
-
先来看看最基础的使用:
Button bt = findViewById(R.id.bt); bt.setOnclickListener(new View.OnclickListener(){ //TO DO SOMETHING });
按钮的点击事件setOnClickListener传入的就是接口对象,将其实现暴露出来,定义点击后要进行的事情。
-
点进去看一下,它事怎么实现的。
public void setOnClickListener(@Nullable OnClickListener l) { if (!isClickable()) { setClickable(true); } getListenerInfo().mOnClickListener = l; } public interface OnClickListener { /** * Called when a view has been clicked. * * @param v The view that was clicked. */ void onClick(View v); }
发现setOnClickListener方法的参数就是一个接口对象,然后将该接口对象保存在ListenerInfo.mOnClickListener中。
-
然后,怎么是使用呢,就看View了。
/** * Directly call any attached OnClickListener. Unlike {@link #performClick()}, * this only calls the listener, and does not do any associated clicking actions like reporting an accessibility event. * * @return True there was an assigned OnClickListener that was called, false otherwise is returned. */ public boolean callOnClick() { ListenerInfo li = mListenerInfo; if (li != null && li.mOnClickListener != null) { li.mOnClickListener.onClick(this); return true; } return false; }
查看注释可以得知,此方法可调用认可附加的OnClickListener,并且它只调用listener,不执行任何关联的单击操作,如报告可访问性。返回true表示布置的OnClickListener被调用了,false则直接返回。
最后可以看到,接口就是将一些方法暴露出来,让使用者定义相关的动作,同事保持了接口持有者的隐蔽性。
------------------------------------------------------------- 以上更新 -------------------------------------------------------
1.为什么有回调机制
有的事情,不知道什么时候会发生,什么时候能够完成。于是,就会有一个监听关注事件的变化,这也就是接口回调
2.简单的举例子
举个例子 模拟下载,实施监督下载的进度,当100%时,提醒下载完成 1. 建立一个下载进度的类 需要监督加载的进度,因此方法内需要一个监督进度的形参接口 class Progress { public void loadProgress(IProgressListener progressListener) { //模拟进度 for (int i = 1; i <= 100; i++) { //进度每改变一次,即调用更新一次监督的数据 progressListener.curProgress(i); } } } 2. 建立监听的回调接口,用来监听进度 interface IProgressListener { void curProgress(int curProgress); } 3.运行调用 实际还是对多态的运用 当Progress类调用loadProgress(IProgressListener progressListener)时 传入的实参是一个匿名内部类,也是IProgressListener的子类 相当于 IProgressListener progressListener = new 子类(); 此时调用的是子类的实现。 public class Main { public static void main(String[] args) { Progress progress = new Progress(); progress.loadProgress(new IProgressListener() { @Override public void curProgress(int curProgress) { System.out.printf("curProgress:" + curProgress + "\r\n"); if (curProgress == 100) System.out.printf("下载完成"); } }); } }