前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Eventbus3代码分析(三):注解简单使用

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

作者头像
dodo_lihao
发布2018-09-12 10:51:25
3230
发布2018-09-12 10:51:25
举报
文章被收录于专栏:懒人开发懒人开发

注解简单使用

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


简单理解和使用

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


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

代码语言:javascript
复制
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface AhView1 {
    int intR();
}

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


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

代码语言:javascript
复制
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));

代码语言:javascript
复制
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即可

代码语言:javascript
复制
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface AhView {
    int value();
}

InjectHelper 方式相同

代码语言:javascript
复制
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 和上面类似

代码语言:javascript
复制
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】了

代码语言:javascript
复制
@AhView(R.layout.activity_main)
public class MainActivity extends BaseActivity {

}

最后也能看到对应的界面


简单总结

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


具体测试代码

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.10.01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 注解简单使用
  • 简单理解和使用
  • 简单理解和使用2
    • 简单总结
      • 具体测试代码
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档