Eventbus3代码分析(三):注解简单使用


注解简单使用

这里目的是为了理解, 和简单的使用 这块理解了,后面都是差不多的


简单理解和使用

自己每次在onCreate中写setContentView(R.layout.xxx) 感觉比较麻烦 自己想把注解写到类的前面,这样比较好修改


先定义 @interface AhView 大体代码为:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface AhView1 {
    int intR();
}

这里ElementType.TYPE, 上面也有提到过 是表示类或者接口的


InjectHelper1 再写一个帮助类,静态方法便于调用:

public class InjectHelper1 {
    public static int injectObject(Object handler) throws Exception {
        Class<?> handlerType = handler.getClass();
        // inject ContentView
        AhView1 contentView = handlerType.getAnnotation(AhView1.class);
        if (contentView != null) {
            try {
                return contentView.intR();
            } catch (Throwable e) {
                throw new Exception("No injection layout");
            }
        }else{
            throw new Exception("No injection layout");
        }
    }
}

大体意思,就是

  • 通过传入的值,拿到对应的Class类
  • 再通过Class拿到对应的注解类AhView1
    • 如果为null,则主动抛出异常
  • 通过AhView1 拿到intR()通过注解设置的值

BaseActivity1 写父类 BaseActivity1, 在父类的onCreate中,setContentView(InjectHelper1.injectObject(this));

public class BaseActivity1 extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle arg0) {
            super.onCreate(arg0);            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            try {
                setContentView(InjectHelper1.injectObject(this));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
}

具体Activity测试 具体的代码

这里直接在类前面配置值, 拿到值后,BaseActivity中直接赋值

最后可以得到:


简单理解和使用2

上面有给对应的Class类配置对应的值 但是,配置的时候,需要设置对应的方法名字 例如: @AhView1(intR = R.layout.activity_main) 我们也可以不用写对应的配置值(当操作比较多的时候,设置值是必要的,如果只有一个值,可以用下面办法去省略)

和上面的类似


AhView 这里我们只需要把方法,设置成value即可

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface AhView {
    int value();
}

InjectHelper 方式相同

public class InjectHelper {
    public static int injectObject(Object handler) throws Exception {
        Class<?> handlerType = handler.getClass();
        // inject ContentView
        AhView contentView = handlerType.getAnnotation(AhView.class);
        if (contentView != null) {
            try {
                return contentView.value();
            } catch (Throwable e) {
                throw new RuntimeException("No injection layout");
            }
        }else{
            throw new RuntimeException("No injection layout");
        }
    }
}

BaseActivity 和上面类似

public class BaseActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle arg0) {
            super.onCreate(arg0);            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            try {
                setContentView(InjectHelper.injectObject(this));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
}

MainActivity 这个时候,对应的设置,就不用 【方法名 = xxx】了

@AhView(R.layout.activity_main)
public class MainActivity extends BaseActivity {

}

最后也能看到对应的界面


简单总结

这里只是用这里小例子,理解对应的注解 和 反射 的过程 对应的方式很多 这里只是和大家一起熟悉流程


具体测试代码

简单的代码,存放在 https://github.com/2954722256/use_little_demo 中的annotation_test对应Module 供简单参考

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏向治洪

android FragmentpagerAdapter和FragmentStatePagerAdapter的区别

1.FragmentPagerAdapter FragmentPagerAdapter 继承自 PagerAdapter。相比通用的 PagerAdapter...

21590
来自专栏水击三千

Android学习之简单的数据存储

在Android中,数据存储是开发人员不可以避免的。Android为开发者提供了很多的存储方法,在前面的博客中,已经讲述了sqlite存储数据。今天将介绍用Sh...

29390
来自专栏蜉蝣禅修之道

android之listview使用方法(一)

15020
来自专栏Android Note

Android RecyclerView添加搜索过滤器

19230
来自专栏青蛙要fly的专栏

项目需求讨论— ButterKnife初级小结

在没有使用DataBinding之前,我的项目都是使用ButterKnife,当然对于ButterKnife大家估计都熟悉的不要太熟悉了。本文我也就当自己的一个...

8630
来自专栏10km的专栏

jface databinding:可多选的widget List组件selection项目与java.util.List对象的双向数据绑定

需求说明 如下图,一个可多选的List组件,初始表有3个值,希望实现与一个java.util.List对象(保存选中的值)的双向数据绑定。当List组件中选中的...

24780
来自专栏开发之途

Dagger2 入门笔记

网上对 Dagger2 进行介绍的文章也已经很多了,一开始看的时候却总是有种从入门到放弃的感觉,因为 Dagger2 中注解的配套使用是需要一定规则的,而文章介...

16740
来自专栏everhad

ViewPager无限滑动

前言 View轮播效果在app中很常见,一想到左右滑动的效果就很容易想到使用ViewPager来实现。对于像我们常说的banner这样的效果,具备无限滑动的功能...

42070
来自专栏向治洪

android之listview缓存图片(缓存优化)

网上关于这个方面的文章也不少,基本的思路是线程+缓存来解决。下面提出一些优化: 1、采用线程池 2、内存缓存+文件缓存 3、内存缓存中网上很多是采用SoftRe...

36390
来自专栏一直在跳坑然后爬坑

RxJava2操作符之“Buffer”

这里贴一下观察者,为了能更清晰的看到发射出来的内容,我们将每一个item都打印出来

7710

扫码关注云+社区

领取腾讯云代金券