Dagger 和 Butter Knife 与 Android 注释

2024-01-10

我正在评估 Android 应用程序的依赖注入 (DI) 框架。最有力的竞争者是:Dagger(带有黄油刀)和 Android Annotations。据我了解,Dagger 和 ButterKnife 是同源的,而且是相辅相成的。以下是我正在寻找的关键矩阵:

  1. 易于使用(我们的构建基于 Gradle,我们使用 Android Studio IDE)
  2. 测试支持(我们使用 Robotium 进行功能测试,使用 RoboLectric 进行单元测试)
  3. 性能(DI框架使用反射,哪个更快?)

Android注解 http://androidannotations.org/
使用编译时注释处理。它生成一个子类,在原始名称后附加下划线(MyActivity_产生于MyActivity)。因此,要使其工作,您始终必须使用生成的类作为引用,而不是原始类。

它有非常丰富的功能集,请参阅可用注释列表 https://github.com/excilys/androidannotations/wiki/AvailableAnnotations.

牛油刀 http://jakewharton.github.io/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 相当于@ViewByIdand @ViewsById)和一些事件绑定(完整列表请参见命名空间目录here https://github.com/JakeWharton/butterknife/tree/master/butterknife/src/main/java/butterknife,只需计算OnXXX事件注释)。

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

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

我发现从匕首开始比较困难,但这可能只是我的经验。不过,请观看此处的一些视频以获得更好的开始:1 http://www.infoq.com/presentations/Dagger, 2 https://www.parleys.com/play/529bde2ce4b0e619540cc3ae

从功能集的角度来看,我想说 Dagger 实现的功能可以与 AndroidAnnotation 的功能进行比较@EBean and @Bean功能。

Summary
如果您正在比较易用性、测试支持和性能,我找不到使用 AndroidAnnotation 和 ButterKnife+Dagger 之间有多大区别。差异在于编程模型(使用带有_而不是使用原始的并手动调用注入)和功能集中。

AndroidAnnotation 为您提供了完整的功能列表,但将您与某些库联系在一起。例如,如果您使用它的 REST API,则必须使用 Spring Android。您还可以对 OrmLite 等功能进行注释(@OrmLiteDao)无论您是否使用 OrmLite。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dagger 和 Butter Knife 与 Android 注释 的相关文章

  • 位图背景图像应支持哪些屏幕尺寸/密度组合?

    我正在编写一个应用程序 我需要一些全屏位图背景 基于我天真的阅读支持多屏 http developer android com guide practices screens support html在 Android 文档中 为了涵盖我的
  • putExtra() 和 setData() 之间的区别

    putExtra 和 setData 有什么区别 我已经阅读了 android 文档 但没有太大帮助 还有之前的一个问题Intent setData 与 Intent putExtra https stackoverflow com que
  • 对话框片段嵌入取决于设备

    在我的应用程序中 用户从联系人或通话记录中选择电话号码 选择联系人非常简单 并且在手机和平 板电脑上都可以很好地工作 i e 在手机上会弹出新的全屏活动 在桌子上我会看到带有联系人列表的漂亮弹出对话框 似乎无法从通话记录中选择电话号码 因此
  • app-release-unsigned.apk 未签名

    我在 github 上下载了 Android 应用程序的 zip 文件 并尝试运行它 但出现一个包含此消息的对话框 app release unsigned apk is not signed Please configure the si
  • Android:如何让设备只运行一个应用程序?

    我有一个客户项目 我必须制作单任务 Android 设备 客户无法逃脱我公司开发的应用程序 此外 客户无法启动任何其他应用程序 而我们的应用程序会在设备启动时启动 总体而言 客户能够使用设备执行的所有操作就是运行我们的应用程序 除了 roo
  • 有人可以给出一个 android 中 webview 实现的确切例子吗

    嗨 我正在使用开发 Android 应用程序WebView执行 我跟着官方安卓教程 http developer android com resources tutorials views hello webview html 在 Ecli
  • Android Studio 安装失败,APK 未签名

    最近从 Eclipse 更改为 Android Studio 我还更改了 JDKjava open jdk to jdk1 7 0 45 现在我尝试运行我的第一个应用程序 并收到以下消息 Installation failed since
  • 该项目可能使用的 Gradle 版本不包含“compileSdkVersion()”方法

    当我尝试运行最初在 Eclipse ADT 上创建的项目时 我遇到了这个问题 Error 17 0 Gradle DSL method not found compileSdkVersion Possible causes ul li Th
  • Android:如果任务管理器终止,则重新调用应用程序

    如果应用程序线程被任务管理器杀死 则应用程序线程将关闭 需要重新调用应用程序 就像它被其他应用程序或任务管理器杀死一样 任何想法 您必须使用 START STICKY 命令运行后台服务 只需扩展 Service 并重写 onCommand
  • 运行 Android 应用程序时出现错误

    我已经使用 Eclipse 创建了一个 Android 应用程序 但应用程序未在 AVD 上运行 它显示 不幸的是已停止工作 日志猫消息如下 07 29 04 59 50 789 W dalvikvm 784 threadid 1 thre
  • LinearLayout:防止最后一个孩子被之前的大文本视图推出或挤压

    我有一个LinearLayout里面有两个孩子 第一个是TextView对于动态内容 第二个是一个按钮 我的问题是按钮被推出其父级或被挤压到不再可见的程度 我想要TextView认识到其父母与第二个孩子一起没有更多空间 并开始新的一行 而不
  • 分离 Fragment 和删除 Fragment 有什么区别?

    在 Android 文档中碎片交易 http developer android com reference android app FragmentTransaction html我注意到两种非常相似的方法 detach and remo
  • Android 10 请求 ACTIVITY_RECOGNITION 权限

    我试图遵守 Google 的要求 为 Android 10 请求 ACTIVITY RECOGNITION 权限 但我似乎不明白为什么没有显示权限弹出窗口 就像其他权限 即位置 存储等 一样 我的代码是 if ContextCompat c
  • 推特更新状态

    我正在通过 twitter4j 将 Twitter 集成到 Android 我可以成功阅读我发布的推文 现在我试图用它发布推文 但我不能 我收到如下奇怪的警告 02 01 16 28 43 298 WARN System err 729 4
  • 如何获取小区广播消息?

    我尝试像模拟人生一样获取小区广播消息的文本 但它不起作用 public class SMSReceiver extends BroadcastReceiver Override public void onReceive Context c
  • 如何从图库动态卸载图像?

    我有自定义 ImageView public class ShadowedImageView extends ImageView private Paint mPaint public Bitmap bitmap null private
  • Android项目中使用java获取电脑的IP地址

    我在用ksoap2 android http code google com p ksoap2 android 我需要使用java获取IP地址 这样我就不必每次都手动输入它 我所说的 IP 地址是指 例如 如果我这样做ipconfig使用命
  • Android Volley - 发布请求 - 无法在线工作

    我试图通过 Volley 发出 POST 请求 它在我的本地主机中工作得很好 但是当我将它移动到网络服务器时 响应为空 Java代码 RequestQueue queue Volley newRequestQueue this String
  • Android Google 地图无法在当前主题中找到样式“mapViewStyle”

    添加谷歌地图视图时 我扩展了MapView 使用xml编辑器将其添加到活动中 并将我的谷歌地图api密钥手动添加到布局xml文件中 我的权限在清单文件中允许互联网 我想知道的是 在 xml 编辑器中 我收到错误 无法在当前主题中找到样式 m
  • 应用程序关闭时单击 Firebase 通知后打开特定活动/片段

    我知道这个问题似乎重复 但根据我的要求 我在网上搜索了很多帖子 但没有任何对我有用 我的要求 我正在使用 Firebase 来获取推送通知 当应用程序打开时意味着一切正常 但我的问题是 如果有任何推送通知出现 应用程序处于后台 关闭意味着我

随机推荐