你会错过的接口理解三部曲:定义,设置和实现

2016-05-12 15:54 评论 3 条

一、摘要

接口和抽象类的区别:1、接口本身就是抽象的方法,2、接口无法定义非抽象方法,变量和常量。由于平时的书写习惯,abstract关键字在定义的接口方法中常常被省略不写,所以给人一种错觉,认为接口不是抽象的,然后往往比较拗口,似乎成为面试者经常要问的一道面试题。

二、理解接口

接口的好处是可以根据任务需要对传递过来的内容或参数进行处理,处理的过程就是实现接口的过程,在我这里把接口理解成三部曲:1、定义接口,2、设置接口,3、实现接口,比如拿经常使用的Button添加点击事件的OnClickListener接口为例:

定义接口:

OnClickListener源码的接口类定义如下:

  1. /** 
  2.      * Interface definition for a callback to be invoked when a view is clicked. 
  3.      */  
  4.     public interface OnClickListener {  
  5.         /** 
  6.          * Called when a view has been clicked. 
  7.          * 
  8.          * @param v The view that was clicked. 
  9.          */  
  10.         void onClick(View v);  
  11.     }  

非常简单干净,接口OnClickListener里面定义一个抽象的回调方法,在Button被点击时,回调onClick(View v)对点击事件进行处理,比如:切换另一个Activity界面,事件处理的过程就是实现接口的过程

设置接口:

设置接口的方法使用的是Getter和Setter的思想,在Button中定义私有属性:OnClickListener listener,定义公共方法:setOnClickListener(OnClickListener l),查看Button提供的源码:

  1. ListenerInfo mListenerInfo;//定义私有属性  
  1. /** 
  2.      * 定义公共方法 
  3.      * Register a callback to be invoked when this view is clicked. If this view is not 
  4.      * clickable, it becomes clickable. 
  5.      * 
  6.      * @param l The callback that will run 
  7.      * 
  8.      * @see #setClickable(boolean) 
  9.      */  
  10.     public void setOnClickListener(@Nullable OnClickListener l) {  
  11.         if (!isClickable()) {  
  12.             setClickable(true);  
  13.         }  
  14.         getListenerInfo().mOnClickListener = l;  
  15.     }  

我之前一直想不明白,设置接口后,是如何回调onClick()方法的?

实现接口:

而且在实现的onClick(View v)方法中,可以获取到设置了接口的View对象的属性,比如在onClick(View v)方法中根据Button的ID判断,执行哪个Activity的操作,代码如下:

  1. new Button(this).setOnClickListener(new View.OnClickListener() {  
  2.             @Override  
  3.             public void onClick(View v) {  
  4.                    switch (v.getId()){  
  5.                        case R.id.msg_type_id:  
  6.                              
  7.                            break;  
  8.                    }  
  9.             }  
  10.         });  

Android开发中,对事件的处理机制有两种方式,一种是基于回调机制的事件处理,一种是基于监听接口的事件处理。很明显上述属于基于监听接口的事件处理,在操作了第一、第二步实现后在第三步实现业务处理。

曾经把接口比喻成一条水管,“接口”就是两条水管的缝合处,在Android开发中,接口时开放的,只需要在某个需要的地方设置了接口,然后某个对象或参数传进来,最后的处理就是实现接口中的方法,即针对业务进行实际操作,就像OnClickListener(View),传入View对象,重写onClick()方法,这里可以改变View的属性、状态或额外的操作。

三、自定义接口

现在有这么一个业务逻辑:需要定义一接口,在接口中定义一个方法传入消息数据,根据数据的消息类型,执行业务处理操作。当看到这个需要时,脑海里有没有一点想法?
开发的步骤:

1、定义MsgBean,消息数据实体

2、对应一个接口即可,比如OnMsgChangeListener,代码:

  1. public interface OnMsgChangeListener {  
  2.     public void doMsg(List<MsgBean> beanList);  
  3. }  

3、定义MsgData,设置接口

  1. public class MsgData{  
  2. private OnMsgChangeListener listener;//定义接口对象  
  3. private Context context;  
  4.   
  5. public MsgData(Context context) {  
  6.         this.context = context;        
  7.     }  
  8. public void setOnMsgChangeListener(OnMsgChangeListener l){  
  9.          this.listener=l;  
  10.          try {  
  11.             List<MsgBean> list=MessageService.getListBean(context.getResources().getAssets().open("msgbean.xml"));  
  12.             if(list==null){  
  13.                 Toast.makeText(context,"解析数据失败。。。",Toast.LENGTH_LONG).show();  
  14.                 return;  
  15.             }  
  16.             listener.doMsg(list);  
  17.         } catch (Exception e) {  
  18.             e.printStackTrace();  
  19.         }  
  20. }  
  21.   
  22. }  

4、定义MsgBeanActivity,实现接口中的方法

  1. MsgData data=new MsgData(this);  
  2.   data.setOnMsgChangeListener(new OnMsgChangeListener() {  
  3.       @Override  
  4.       public void doMsg(List<MsgBean> listBean) {  
  5.   
  6.           textView.setText("收到的消息类型是:"+listBean.get(0).getType()+"\n"+"消息内容是:"+listBean.get(0).getMessage());  
  7.       }  
  8.   });  

5、根据消息的类型,对业务进行处理。

最终运行的效果如下图:
interface-demo

当前文章价值2.51元,扫一扫支付后添加微信提供帮助!(如不能解决您的问题,可以申请退款)

你可能感兴趣的文章

来源:每日教程每日一例,深入学习实用技术教程,关注公众号TeachCourse
转载请注明出处: https://teachcourse.cn/1757.html ,谢谢支持!

资源分享

ubuntu站点nginx错误日志upstream timed out (110 Connection timed out) while reading upstream ubuntu站点nginx错误日志upstrea
一键pdf转doc工具 一键pdf转doc工具
OpenClaw WebChat 使用指南 OpenClaw WebChat 使用指南
Windows 10重置此电脑后出现的问题 Windows 10重置此电脑后出现的问

发表评论

呲牙 憨笑 坏笑 偷笑 色 微笑 抓狂 睡觉 酷 流汗 鼓掌 大哭 可怜 疑问 晕 惊讶 得意 尴尬 发怒 奋斗 衰 骷髅 啤酒 吃饭 礼物 强 弱 握手 OK NO 勾引 拳头 差劲 爱你

表情

  1. TeachCourse博主
    TeachCourse博主 【县长】【站长】 @回复

    可以的!!!

  2. zengda
    zengda 【农民】 @回复

    研究研究,学习学习。

  3. 纤沫
    纤沫 【农民】 @回复

    点赞。