匕首和黄油刀与Android注释

 liuxiaoli8611 发布于 2023-01-08 10:43

我正在评估Android应用程序的依赖注入(DI)框架.最有力的竞争者是:Dagger(有Butter Knife)和Android Annotations.据我所知,Dagger和ButterKnife来自同一个源头,他们相互补充.这是我正在寻找的关键矩阵:

    易于使用(我们的构建基于Gradle,我们使用Android Studio IDE)

    测试支持(我们使用Robotium进行功能测试,使用RoboLectric进行单元测试)

    性能(DI框架使用反射,哪一个更快?)

ChrLipp.. 53

AndroidAnnotations
使用编译时注释处理.它生成一个子类,其下划线附加到原始名称(MyActivity_从中生成MyActivity).因此,要使其工作,您始终必须使用生成的类作为引用而不是原始类.

它具有非常丰富的功能集,请参阅可用注释列表.

Butterknife
还使用编译时注释处理,但它生成由中心类(ButterKnife)使用的查找器类.这意味着您可以使用原始类进行引用,但必须手动调用注入.ButterKnife介绍的副本:

@Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_activity);
    ButterKnife.inject(this);
    // TODO Use "injected" views...
}

功能集不是那么丰富,ButterKnife支持视图注入(AndroidAnnotations等效@ViewById@ViewsById)和一些事件绑定(有关完整列表,请参阅此处的命名空间目录,只计算OnXXX事件注释).

Dagger
是Android的DI实现,类似于Guice.它还使用编译时注释处理并生成用于手动注入的对象图.您可以区分应用程序对象图和作用域对象图,以便在活动中进行注入.在这里你看到一个Application.onCreate例子:

@Override public void onCreate() {
    super.onCreate();
    objectGraph = ObjectGraph.create(getModules().toArray());
    objectGraph.inject(this);
    // use injected classes
}

我发现用匕首开始更难,但这可能只是我的经验.但看到一些视频在这里美好的开始:1,2

从功能设置的角度来看,我会说Dagger实现了可以与AndroidAnnotation @EBean@Bean功能进行比较的功能.

总结
如果您要比较易用性,测试支持和性能,我在使用AndroidAnnotation和ButterKnife + Dagger之间找不到太多区别.编程模型中的差异(使用类_而不是使用原始类并手动调用注入)和功能集中.

AndroidAnnotation为您提供了完整的功能列表,但您可以将其与某些库联系起来.例如,如果你使用它的rest api,你必须使用Spring Android.@OrmLiteDao无论是否使用OrmLite,您还可以获得OrmLite()等功能的注释.

最后,这是一个品味问题,至少在我看来.

4 个回答
  • 这是Dzone博客中的Nice文章.

    我们需要比较每个的功能,例如:

    需要最低罐子

    ActionBarSherlock兼容性

    单击侦听器的注入

    POJO注射

    性能

    在此输入图像描述

    只有Pojo Injection在butterknife中丢失!看起来像Butterknife是赢家!

    资源

    2023-01-08 10:45 回答
  • 谷歌确实特别要求不使用依赖注入.

    但是通过阅读他们的请求,他们似乎更多地指的是Guice基于反射的DI库.库,比如机器人注释使用没有反射代替采用编译时生成的代码,而butterknifedagger使用反射的Android优化少量但是所谓略高于更强大android annotation.这实际上取决于项目以及您愿意采取多少性能影响.在我看来,使用butterknife就足以加速代码开发本身.如果你需要稍微多一些的使用android annotation,最后如果你愿意因为反射而略微受到性能影响,那么最好的选择是在没有绝对破坏性能的情况下使用强大Guice的反射使用dagger+ butterknife.

    2023-01-08 10:45 回答
  • 你应该试试Toothpick.

    牙签是(根据自述文件):

    纯java

    快,它不使用反射而是注释处理

    简单,灵活,可扩展和强大,强大和经过测试

    线程安全

    记录和开源

    范围安全:它实施无泄漏的应用程序

    面向测试:它使测试更容易

    它适用于Android或任何其他基于上下文的框架(例如Web容器)

    在大多数情况下,它甚至比Dagger 2更快,而且更简单.

    注意:是的,我是作者之一.

    2023-01-08 10:46 回答
  • AndroidAnnotations
    使用编译时注释处理.它生成一个子类,其下划线附加到原始名称(MyActivity_从中生成MyActivity).因此,要使其工作,您始终必须使用生成的类作为引用而不是原始类.

    它具有非常丰富的功能集,请参阅可用注释列表.

    Butterknife
    还使用编译时注释处理,但它生成由中心类(ButterKnife)使用的查找器类.这意味着您可以使用原始类进行引用,但必须手动调用注入.ButterKnife介绍的副本:

    @Override public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.simple_activity);
        ButterKnife.inject(this);
        // TODO Use "injected" views...
    }
    

    功能集不是那么丰富,ButterKnife支持视图注入(AndroidAnnotations等效@ViewById@ViewsById)和一些事件绑定(有关完整列表,请参阅此处的命名空间目录,只计算OnXXX事件注释).

    Dagger
    是Android的DI实现,类似于Guice.它还使用编译时注释处理并生成用于手动注入的对象图.您可以区分应用程序对象图和作用域对象图,以便在活动中进行注入.在这里你看到一个Application.onCreate例子:

    @Override public void onCreate() {
        super.onCreate();
        objectGraph = ObjectGraph.create(getModules().toArray());
        objectGraph.inject(this);
        // use injected classes
    }
    

    我发现用匕首开始更难,但这可能只是我的经验.但看到一些视频在这里美好的开始:1,2

    从功能设置的角度来看,我会说Dagger实现了可以与AndroidAnnotation @EBean@Bean功能进行比较的功能.

    总结
    如果您要比较易用性,测试支持和性能,我在使用AndroidAnnotation和ButterKnife + Dagger之间找不到太多区别.编程模型中的差异(使用类_而不是使用原始类并手动调用注入)和功能集中.

    AndroidAnnotation为您提供了完整的功能列表,但您可以将其与某些库联系起来.例如,如果你使用它的rest api,你必须使用Spring Android.@OrmLiteDao无论是否使用OrmLite,您还可以获得OrmLite()等功能的注释.

    最后,这是一个品味问题,至少在我看来.

    2023-01-08 10:46 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有