为什么 Android 中的 Loader 很糟糕

2024-04-08

我读过几条推文和评论,说装载机很糟糕,使用它们是“朝自己脸上开枪”的好方法。还普通人宣布他将停止他的图书馆的任何工作:Loaderex. 平民还说“加载器是一个失败的抽象”。

我显然在这里遗漏了一些东西,我想了解更多信息并了解为什么装载机不好以及为什么应该避免它们。

注意:我已经创建了一个 Android 应用程序(可能是中等复杂度),我在其中使用了 Loaders,并且在使用 Loaders 时没有遇到任何问题。这就是为什么它让我困惑。

我还想了解其他更好的备择方案到装载机。提前致谢


为什么装载机不好以及为什么应该避免它们

你会注意到,这不是我说的。我说过加载器是一个失败的抽象。有区别。

当尝试创建一个可重用的框架时,一般建议是设计和创建该框架的三个离散实现。如果您的框架可以支持三种不同的方法,那么设计可能足够灵活,可以处理未来的实现。

The Loader归根结底,框架是围绕一个实现而设计的:CursorLoader。时期。没有其他具体实现Loader在 SDK 中。特别是,Loader框架有一个合同,要求实施Loader能够自动提供更新的结果。虽然从角度来看这是一份可爱的合同users of the Loader框架,这让那些可能创建的人变得困难实施 of the Loader框架。

我尝试创建两个单独的实现Loader框架,用于 SQLite 和SharedPreferences(如果单独计算 Android 版 SQLCipher,则为 3 个)。 SQLite 很糟糕,因为执行自动重新加载的唯一方法是Loader知道什么需要重新加载,这很笨拙。这SharedPreferences曾经有用过,但有人指出现在onLoadFinished()如果代表结果的对象(Cursor for a CursorLoader, SharedPreferences for SharedPreferencesLoader) 与之前是同一个对象。那打破了SharedPreferencesLoader,自从SharedPreferences对象已更新in situ当偏好改变时。

写完我的Loader实现并使用它们一段时间后,我得出的结论是它们不值得。我宁愿使用自己异步加载东西AsyncTask or IntentService并使用消息总线(Otto、greenrobot 的 EventBus 等)来通知感兴趣的各方有关数据的更改。当我could把那个东西包裹在里面Loader,我不相信它能解决足够多的问题,值得付出努力。

现在,如果您正在使用ContentProvider并希望使用CursorLoader, 没关系。它可能有其自身的问题,但至少它应该可以工作。

关于 CWAC-LoaderEx 库,我将停止使用它,因为:

  • 我一天只有这么多时间,因此作为 CWAC 库 AAR 化的一部分,我正在决定哪些库值得努力维护

  • 除了一些书籍示例之外,我个人不使用 CWAC-LoaderEx

  • CWAC-LoaderEx 依赖于过多的内部实现Loader让我感到放心,我将能够长期保持它的工作(参见SharedPreferencesLoader)

CWAC-LoaderEx 不会去任何地方,但我只是不会投入更多时间。如果有人拥有维护/扩展的分叉与我联系,我将很乐意从项目自述文件中链接到他们的分叉。

我还想知道 Loaders 的其他更好替代品

All a Loader所做的是异步加载内容,在检测到内容更改时重新加载该内容,并在配置更改期间保留所述内容。保留模型(或无头)片段可以做同样的事情,与AsyncTask.

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

为什么 Android 中的 Loader 很糟糕 的相关文章

随机推荐

  • 如何在 Perl 中使用符号引用?

    在 Perl 中 如果一个变量保存另一个变量的名称 我如何使用第一个变量来访问另一个变量 例如 让 name bob bob jerk perlfan 我应该如何使用 name 来了解 Bob 是一个什么样的人 虽然我不太确定 但我模糊的记
  • 如何使用弱链接 CocoaPods 库构建 iOS 框架

    我正在尝试使用 Xcode 6 提供的新模板来构建一个 iOS 框架 Test framework 用于创建 Cocoa Touch 框架 该框架具有在 Podfile 中指定的不同依赖项 如 AFNetworking 或 Facebook
  • App Engine 上的 Servlet 响应中与缓存相关的 HTTP 标头被覆盖

    我在应用程序引擎上有一个提供图像的servlet Servlet 正确设置 HTTP 标头值以指示应缓存图像 但 App Engine 会覆盖这些标头 从而导致图像不被缓存 请注意 相同的代码以前可以工作 但现在一段时间不能工作 App 引
  • 在加载页面的所有元素之前加载 Chrome 扩展

    我想在页面的所有元素加载之前 而不是之后 加载我的 Chrome 扩展 这可能吗 谢谢 如果通过扩展你的意思是内容脚本那么你最多可以做的是设置 run at document start 清单中的财产意味着 内容脚本 文件是在 css 中的
  • 使用 PHP 的交互式 shell

    是否可以单独使用 PHP 创建交互式 shell 我的意思是像数据库一样 Python https en wikipedia org wiki Python 28programming language 29等等 如果是的话 怎么样 是的
  • Github 下载页面/按钮不再可见

    我曾经使用存储库中文件选项卡上的下载 添加下载 按钮上传二进制文件 这个功能好像没有了 有人知道为什么吗 临时 Github 问题 浏览器问题 GitHub 上传已于 12 月 11 日停止 请参阅博客文章 https github com
  • "rdtsc": "=a" (a0), "=d" (d0) 这是做什么的? [复制]

    这个问题在这里已经有答案了 我是 C 和基准测试的新手 我不明白这部分代码的作用是什么 所以我发现了一些关于 edx eax 寄存器的信息 但我不完全理解它是如何在代码中发挥作用的 所以我理解这段代码本质上返回了CPU周期的当前滴答声 那么
  • 如何在 Playgrounds 中设置 ViewController?

    在 Swift Playgrounds 中 如何设置视图控制器并使用它 我之前用 UIView 做过 但是当方向不同时 UI 会被剪切 所以我想尝试使用视图控制器 我有let view UIViewController 但在那之后我该如何设
  • Office-js Excel:获取新保存文件的文件名

    如何获取新保存文件的文件名 通常 我可以使用以下方式获取文件名 Office context document url 然而 当用户打开一个新工作簿时 它实际上没有文件名 而且奇怪的是 即使保存后 这行代码也不起作用 相反 他们必须保存它
  • 在 UIImage iOS 6.0 的所有四个面上添加阴影

    我正在尝试向 imageView 的所有四个侧面添加阴影 我看到 self shadowView layer shadowOffset CGSizeMake 10 20 在两侧添加阴影 如何在四个面上都添加阴影 刚刚设置shadowOffs
  • 从列表创建变量并全局访问

    我正在编写一个程序 从数据库中提取部门列表 我想避免对此进行硬编码 因为列表可能会发生变化 我想为每个部门创建一个变量 将问题填充到 GUI 中 我遇到的问题是我可以使用 vars 函数从数据库列表中创建变量 然后 我存储变量名称列表 以便
  • Java 相当于 C++ 加密 [重复]

    这个问题在这里已经有答案了 我有以下用于加密的 C 代码片段 EVP CIPHER CTX ctx const EVP CIPHER cipher EVP des ede3 cbc unsigned char iv EVP MAX IV L
  • 如何通过直接链接将 WebCal/iCalendar 添加到 Google 日历

    您可以通过直接链接将 Google 托管的日历添加到您的 Google 日历帐户 例如澳大利亚假期 https www google com calendar embed src en australian 23holiday 40grou
  • 在 makefile 中,目录名是假目标还是“真实”目标?

    根据我所读到的有关 makefile 的内容 虚假目标是指与实际文件名不对应的任何目标 我的直觉表明 作为目标的目录将被视为与文件相同 为什么这很重要 我的 makefile 中有一个目录作为目标 当我将其作为主要可执行文件的先决条件时 无
  • 如何以编程方式访问 NIB 中的 UI 元素而不“连接”它们?

    我正在考虑编写一些辅助函数 以便更轻松地对 iPhone NIB 中的 UI 元素进行简单的更改 主要是 我想通过 Interface Builder 中的名称访问 UILabel 或其他元素 这可能吗 有更聪明的方法吗 Example 假
  • 用于旋转 QWidget 的 QPropertyAnimation

    我是 Qt 新手 遇到一些问题QWidget回转 我在 QLabel 中有一个 QPixmap 我想要的是让它连续旋转 90 度 I know QPropertyAnimation我知道如何使用它 但我正在努力解决如何使用它来旋转QWidg
  • 向下滑动动画Angular 4

    我正在尝试为我的页面添加动画效果 但遇到以下问题 我的页面上有内容 div 以及一个可在内容上方打开另一个 div 的按钮 我希望该 div 淡出并滑入 并且下面的 div 也向下 向上滑动 我为上面的 div 创建了我想要的动画 该动画在
  • 如何删除 JavaScript 数组元素并重置键

    我有一个如下所示的数组 var fields name mark age 23 name smith age 28 name kelvin age 25 name micheal age 22 我知道字段现在将具有索引 键 0 1 2 3
  • 找出哪些超类包含属性或方法实现

    如果我已经正确记录了方法或属性 我可以通过键入找到它的定义位置help class method 这会告诉我Help for class method is inherited from superclass otherclass 通常 这
  • 为什么 Android 中的 Loader 很糟糕

    我读过几条推文和评论 说装载机很糟糕 使用它们是 朝自己脸上开枪 的好方法 还普通人宣布他将停止他的图书馆的任何工作 Loaderex 平民还说 加载器是一个失败的抽象 我显然在这里遗漏了一些东西 我想了解更多信息并了解为什么装载机不好以及