Android接口回调深入理解

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




  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值