一、摘要
接口和抽象类的区别:1、接口本身就是抽象的方法,2、接口无法定义非抽象方法,变量和常量。由于平时的书写习惯,abstract关键字在定义的接口方法中常常被省略不写,所以给人一种错觉,认为接口不是抽象的,然后往往比较拗口,似乎成为面试者经常要问的一道面试题。
二、理解接口
接口的好处是可以根据任务需要对传递过来的内容或参数进行处理,处理的过程就是实现接口的过程,在我这里把接口理解成三部曲:1、定义接口,2、设置接口,3、实现接口,比如拿经常使用的Button添加点击事件的OnClickListener接口为例:
定义接口:
OnClickListener源码的接口类定义如下:
- /**
- * Interface definition for a callback to be invoked when a view is clicked.
- */
- public interface OnClickListener {
- /**
- * Called when a view has been clicked.
- *
- * @param v The view that was clicked.
- */
- void onClick(View v);
- }
非常简单干净,接口OnClickListener里面定义一个抽象的回调方法,在Button被点击时,回调onClick(View v)对点击事件进行处理,比如:切换另一个Activity界面,事件处理的过程就是实现接口的过程
设置接口:
设置接口的方法使用的是Getter和Setter的思想,在Button中定义私有属性:OnClickListener listener,定义公共方法:setOnClickListener(OnClickListener l),查看Button提供的源码:
- ListenerInfo mListenerInfo;//定义私有属性
- /**
- * 定义公共方法
- * Register a callback to be invoked when this view is clicked. If this view is not
- * clickable, it becomes clickable.
- *
- * @param l The callback that will run
- *
- * @see #setClickable(boolean)
- */
- public void setOnClickListener(@Nullable OnClickListener l) {
- if (!isClickable()) {
- setClickable(true);
- }
- getListenerInfo().mOnClickListener = l;
- }
我之前一直想不明白,设置接口后,是如何回调onClick()方法的?
实现接口:
而且在实现的onClick(View v)方法中,可以获取到设置了接口的View对象的属性,比如在onClick(View v)方法中根据Button的ID判断,执行哪个Activity的操作,代码如下:
- new Button(this).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- switch (v.getId()){
- case R.id.msg_type_id:
- break;
- }
- }
- });
在Android开发中,对事件的处理机制有两种方式,一种是基于回调机制的事件处理,一种是基于监听接口的事件处理。很明显上述属于基于监听接口的事件处理,在操作了第一、第二步实现后在第三步实现业务处理。
曾经把接口比喻成一条水管,“接口”就是两条水管的缝合处,在Android开发中,接口时开放的,只需要在某个需要的地方设置了接口,然后某个对象或参数传进来,最后的处理就是实现接口中的方法,即针对业务进行实际操作,就像OnClickListener(View),传入View对象,重写onClick()方法,这里可以改变View的属性、状态或额外的操作。
三、自定义接口
现在有这么一个业务逻辑:需要定义一接口,在接口中定义一个方法传入消息数据,根据数据的消息类型,执行业务处理操作。当看到这个需要时,脑海里有没有一点想法?
开发的步骤:
1、定义MsgBean,消息数据实体
2、对应一个接口即可,比如OnMsgChangeListener,代码:
- public interface OnMsgChangeListener {
- public void doMsg(List<MsgBean> beanList);
- }
3、定义MsgData,设置接口
- public class MsgData{
- private OnMsgChangeListener listener;//定义接口对象
- private Context context;
- public MsgData(Context context) {
- this.context = context;
- }
- public void setOnMsgChangeListener(OnMsgChangeListener l){
- this.listener=l;
- try {
- List<MsgBean> list=MessageService.getListBean(context.getResources().getAssets().open("msgbean.xml"));
- if(list==null){
- Toast.makeText(context,"解析数据失败。。。",Toast.LENGTH_LONG).show();
- return;
- }
- listener.doMsg(list);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
4、定义MsgBeanActivity,实现接口中的方法
- MsgData data=new MsgData(this);
- data.setOnMsgChangeListener(new OnMsgChangeListener() {
- @Override
- public void doMsg(List<MsgBean> listBean) {
- textView.setText("收到的消息类型是:"+listBean.get(0).getType()+"\n"+"消息内容是:"+listBean.get(0).getMessage());
- }
- });
5、根据消息的类型,对业务进行处理。
最终运行的效果如下图:
你可能感兴趣的文章
转载请注明出处: https://www.teachcourse.cn/1757.html ,谢谢支持!