• 接口回调之简要理解


    【背景】在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 + "
    ");
                    if (curProgress == 100)
                        System.out.printf("下载完成");
                }
            });
        }
    }

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

  • 相关阅读:
    hadoop 2.0 详细配置教程
    大数据架构:flume-ng+Kafka+Storm+HDFS 实时系统组合
    KAFKA分布式消息系统
    element table组件懒加载
    vue将页面导出成pdf
    element upload上传前对文件专门bs64上传
    element table 通过selection-change选中的索引删除
    JavaScript实现Word、Excel、PPT在线预览
    数组对象位置对换
    textarea 根据光标位置添加内容
  • 原文地址:https://www.cnblogs.com/wisdomzhang/p/10705613.html
Copyright © 2020-2023  润新知