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

2016-05-12 15:54 阅读 4,286 次 评论 3 条
版权声明:本文著作权归TeachCourse所有,未经许可禁止转载,谢谢支持!
转载请注明出处:http://teachcourse.cn/1757.html

一、摘要

接口和抽象类的区别: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

关注公众号 扫一扫二维码,加我QQ

如果文章对你有帮助,欢迎点击上方按钮关注作者

来源:TeachCourse每周一次,深入学习Android教程,关注(QQ1589359239或公众号TeachCourse)
转载请注明出处:http://teachcourse.cn/1757.html
如何自定义View视图控件案例开发(一) 如何自定义View视图控件案例开发
Android应用微信分享与收藏功能实现 Android应用微信分享与收藏功能
genymotion注册页面打不开怎么回事 genymotion注册页面打不开怎么回
最新Android Studio 快速入门(开发)指南 最新Android Studio 快速入门(

发表评论

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

表情

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

    可以的!!!

  2. zengda
    zengda 【农民】 @回复

    研究研究,学习学习。

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

    点赞。