Android接口回调深入理解

来源:互联网 发布:sql查询替换部分字符串 编辑:程序博客网 时间:2024/05/22 22:27

在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的开源精神,上面有我的邮箱,欢迎小伙伴们多交流!




1 0
原创粉丝点击