《撸代码学习 IOC注入技术2》—— 事件注入

本文介绍了如何通过自定义注解和反射实现Android中的事件注入技术,包括创建BaseEvent和OnClick注解,以及实现注入逻辑,使得代码更加灵活,避免了大量if/else和重复代码。详细讲解了事件注入的步骤和动态代理的应用。
摘要由CSDN通过智能技术生成

不诗意的女程序媛不是好厨师~
转载请注明出处,From李诗雨—https://blog.csdn.net/cjm2484836553/article/details/104581855

源代码下载地址:https://github.com/junmei520/iocStudy

在这里插入图片描述

在上一篇 的文章 《撸代码 学习 IOC注入技术1 》—— 布局注入 与 控件注入中,我们已经自己通过敲代码,一步一步实现了,运行时注入的—布局注入和控件注入。那么今天,我将来继续敲代码,来一步一步实现,事件的注入。

先来看一下我要达到的效果:
在这里插入图片描述
即:我想通过这两句代码,就实现点击事件。

根据上一篇中我们讲的 布局注入 和 控件注入 的经验,大家对于实现我们今天的 事件注入 有没有什么想法和思路呢?

对!我们还是要自己造个女朋友InjectUtils,然后在BaseActivity中就进行注入。

那接下来呢?接下来继续要怎么做?你会不会是这样想的:
在这里插入图片描述

你是不是想:“那还不简单吗?和之前的类似啊,先自定义一个注解OnClick,然后具体实现InjetUtils中的injectEvent()方法呀!”

那我有要问:“那你打算具体怎么实现injectEvent()呢?”

你是不是还会像这样回答:“当然主要还是通过反射啦,①先获取activity的所有方法;②再获取方法上的 OnClick 注解,进而得到注解后面的id ,然后得到button;③最后反射执行 btn1.setOnClickListener(new View.OnClickListener() {…}巴拉巴拉巴拉…”

在这里插入图片描述

emmm… 我想说,你这么想其实也没有什么大问题,就是有点,emmm…,有点太low啦。因为如果你这样做的话,那就是把代码写死了呀~~~

比如说,如果我还想加个长按事件呢,像这样:
在这里插入图片描述

你可能会说,那我就改injectEvent()代码呀!

emmm…我忍!那如果我再继续增加几个事件呢?你还打算继续改injectEvent()的内部代码吗?还打算增加许多的if/else或很多的谜之缩进吗???你自己体会一下~~~

显然这样把代码写死是不可行的,那我们怎么样才能使得我们自己的代码变得灵活呢?

那我们就必须寻找不同事件的共同点了,然后把相同点抽取出来。

让我们再用新的眼光来审视一下短按和长按事件:
在这里插入图片描述

我们可以总结出,所有的事件都具有三要素:

  • 1.事件源
  • 2.事件
  • 3.事件的处理
  • 最后还要进行订阅(订阅关系)

既然知道了这一点,那我们再自定义注解OnClick的时候就可以把这三要素也加进去了。

下面我们就来正式的讲讲正确的思路了:

首先我们先自定义一个注解BaseEvent,它可以用来接受事件的三要素信息,并且将来会把它用在OnClick注解的身上:

@Target(ElementType.ANNOTATION_TYPE) //该注解是用在自定义注解上的
@Retention(RetentionPolicy.RUNTIME)  //可以保留到程序运行时
public @interface BaseEvent {
   
    Class<?> enventType();  //事件 ---> 即相当于 new View.OnClickListener()

    String setterMethod(); //订阅关系 ---> 即相当于 setOnClickListener()

    String callbackMethod(); // 事件回调方法 ---> 即相当于 onClick()

}

然后我们再来定义OnClick注解,它的头上使用了BaseEvent注解,并传入三要素。

@Target(ElementType.METHOD) //该注解是用在方法上的
@Retention(RetentionPolicy.RUNTIME) //该注解可以保持到程序运行时
@BaseEvent(enventType = View.OnClickListener.class,
        setterMethod = "setOnClickListener",
        callbackMethod = "onClick")
public @interface OnClick {
   
    int[] value() default -1; //由于可能是多个id,所以此处要用数组来接收
}

使用的时候就这样:

@OnClick({
   R.id.button1, R.id.button2})
public void click(View view) {
   
    //...具体操作...
}

如果要再加入其他的事件,也很好办,比如我要再加一个长按事件,那我就只要多增加一个OnLongClick的注解就可以了,它的地方都不用做任何的修改。其实,这就是我们所说的 注解的多态。

//增加一个长按事件
@OnLongClick({
   R.id.button1, R.id.button2})
public 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值