在Android开发过程中,我们一直在使用控件的各种监听事件,比如用了无数次的button的点击事件
/**
* Created by licrynoob on 2016/5/13.
* Copyright (C) 2016 Email:licrynoob@gmail.com
*/
public class MainActivity extends Activity {
private Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//1
mButton = new Button(this);
//2
mButton = findViewById(R.id.button);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"button",Toast.LENGTH_SHORT).show();
}
});
}
}
当这个Button被点击的时候,就会在当前的Activity显示一个Toast,下面就详细的分析一下这个过程是怎么实现的。
首先,抛开Android不谈,我们先来理解一下Java中接口回调的思想,接着去模拟一个点击事件的产生,触发和回调的过程:
有两个类A和B,一个接口OnClickLister,
/**
* Created by licrynoob on 2016/5/13.
* Copyright (C) 2016 Email:licrynoob@gmail.com <br>
*/
public class A {
/**
* A的成员变量
*/
private OnClickListener mOnClickListener;
/**
* 模拟A在做某事
*/
public void doSomeThing() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(1000 * 2);
} catch (InterruptedException e) {
e.printStackTrace();
}
//每2秒A就使用一下自己的接口
onClickListenerCallBack(i);
}
}
/**
* 为自己的接口赋值
*
* @param onClickListener
*/
public void setOnClickListener(OnClickListener onClickListener) {
this.mOnClickListener = onClickListener;
}
/**
* 使用自己的接口
*
* @param position
*/
private void onClickListenerCallBack(int position) {
if (mOnClickListener != null) {
mOnClickListener.onClick(position);
}
}
/**
* 点击接口,可以形象的理解为某种工具
* 这个工具拥有position这个参数,并且具有点击的的功能
* 但点击的功能只是抽象的定义,没有具体的实现
*/
public interface OnClickListener {
/**
* 点击动作,待实现
*/
void onClick(int position);
}
}
/**
* Created by licrynoob on 2016/5/13.
* Copyright (C) 2016 Email:licrynoob@gmail.com <br>
*/
public class B {
public static void main(String[] args) {
A a = new A();
a.setOnClickListener(new A.OnClickListener() {
@Override
public void onClick(int position) {
System.out.println("我是B" + position);
}
});
a.doSomeThing();
}
}
注释写的都很详细,我们再把过程理一遍
首先B作为程序的主入口, 先new出A的一个实例a,相当于Android中的new Button或者findViewById,然后为a的成员变量mOnclickListener赋值,此处采用匿名内部类的方式new了一个接口,重写并具体实现了onClick方法,打印我是B和当前的i值,到此还没有体现任何接口的功能,别急,下面执行a.doSomeThing(),我们来具体的分析这个方法的执行流程,a先睡眠2秒,a使用onClickListenerCallBack(i),传递了当前i的值。在onClickListenerCallBack(int position)中拿到i,并使用自身的mOnClickListener.onClick()方法,而mOnClickListener的值是B类设置的,并且重写的onClick的方法,由于多态的存在,此时会调用在B类中传入的具体方法,即执行B中重写的方法。站在B的角度来看,当a做某事时会把自身的position值传给B,并且B拿到position可以去实现自己的行为,比如打印一条当前position的信息。如此重复循环10次。
至此,一个完整的回调过程就解开了!
把它对应成Android的点击流程,在BActivity中拥有Button a,当a执行某方法时就会回调B中重写的行为!
我是一个非IT毕业的小罗罗,Java也都是自学的,所以基础很差,但在Android开发的过程中慢慢的体会着,真的是感谢google的开源精神,上面有我的邮箱,欢迎小伙伴们多交流!