【背景】在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("下载完成");
}
});
}
}

本文深入探讨了Android中接口回调机制的基本原理与应用。通过分析Button的点击事件处理过程,详细解释了接口如何作为参数传递并保存,以及如何在特定条件下触发回调。此外,还通过一个下载进度监听的例子,展示了接口回调在实际场景中的灵活性和实用性。
5499

被折叠的 条评论
为什么被折叠?



