接口回调之简要理解

【背景】在Android中非常多得使用到了接口回调的机制,今天就有幸了解一下,接口回调是怎么回事(简单理解)

接口回调的使用:

接口回调在android中的使用还是蛮多的,记录一下吧,也算是皮毛吧。毕竟,用起来还是很灵活的。

  1. 先来看看最基础的使用:

  Button bt = findViewById(R.id.bt);
  bt.setOnclickListener(new View.OnclickListener(){
      //TO DO SOMETHING
  });

按钮的点击事件setOnClickListener传入的就是接口对象,将其实现暴露出来,定义点击后要进行的事情。

  1. 点进去看一下,它事怎么实现的。

  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中。

  1. 然后,怎么是使用呢,就看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("下载完成");
            }
        });
    }
}

 【注:】参考博客:https://www.jianshu.com/p/69deff6960b8

posted @ 2019-04-14 16:15  sky-walker  阅读(710)  评论(0编辑  收藏  举报