草庐IT

android - 加载器框架与普通 AsyncTask

coder 2023-07-21 原文

在我的应用程序中,我需要大量的 CRUD 内容:从本地 SQLite 数据库读取记录、插入对象和更新内容。大多数查询都非常简单,即使在 UI 线程上运行也不会阻塞,但是在这个应用程序中我想采用 Windows Phone 模式:out 动画立即开始,在动画中在结果交付时开始。

我计划使用 AsyncTask 来完成这项工作,但我注意到 Honeycomb(和兼容包)引入了这个新的 Loader 框架。主要优点似乎是 Loader 加载的数据在配置更改后仍然存在。 LoaderEx Commonsware 项目在 SQLite 和框架之间架起了桥梁,但出现了一些问题。

  1. 资源清理:我使用单个 Activity ,在 onCreate() 中创建 SQLiteOpenHelper 并在 onDestroy() 中关闭它。由于加载程序管理器可能仍在运行,我检查它并在我的回调对象上设置一个 pendingClose 标志,因此它会在加载完成时关闭游标和助手。我认为不关闭数据库没有害处,但如果你不这样做,SQLite 会提示,而且我不喜欢错误消息:) 这里的重点是数据不会在配置更改后继续存在,所以 Loader 的优势消失了

  2. 我应该创建多少加载器?假设我有心爱的 CustomerOrder 表。加载程序由 ID 标识,例如 CUST_LORD_L,但每次用户点击一些摘要时,我都想在屏幕上显示细节。我应该restart具有不同参数的装载机,或者我应该 init一个带有随机 ID 的新的?这可能会发生几十次。 Loader 框架是为大量运行的小作业设计的,还是只为一些长时间运行的任务设计的?

  3. LoaderCallbacks 接口(interface)中使用ID 的目的是什么?为什么不是简单的 initLoader(params, callback)?我认为不能在回调中重用某些逻辑:最终他会分支(使用 ID 上的 if-elseswitch)所以我不明白为回调对象提供标识符的关键点,而不是一种天真的方法 one-callbacks-per-operation

我问这个是因为整个框架对我来说似乎设计过度并且没有真正的实用性。我不明白使用 LoaderManager 集中代码的意义,而且我看不到 AsyncTask 没有提供的任何新机会。

唯一的胜利点是配置更改生存,但由于资源清理我无法利用它,而且我无法找到关闭 SQLiteOpenHelper 的替代方法,因为(很明显) SQLiteCursorLoader需要它,但清理它取决于用户。所以 AsyncTask 似乎是这里的赢家选择,但也许我遗漏了一些东西。

最佳答案

  1. 内容提供商比“原始数据库”方法更强大。 stackoverflow 上的许多链接都引发了对此的讨论。
  2. LoaderManager 尝试通过 ID 区分加载程序(这就是 initLoader 的签名指定此参数的原因)。如果具有特定 ID 的加载程序的数据已经存在,则需要加载程序的 ID 来重新传送缓存的结果(因此无需再次异步重新加载)。
  3. restartLoader 调用强制 LoaderManager 启动由先前创建的加载器指定的异步操作。 initLoader 在创建新加载器之前尝试重用现有加载器。
  4. Fragments 和 Activity 有自己的不重叠的 LoaderManagers。

我的经验表明,即使使用 Content Provider 实现起来听起来有些矫枉过正,但它实际上在未来会带来不错的返回。性能影响微不足道(尝试测量它),UI-Data 绑定(bind)是开箱即用的(因为内容观察器和 CursorLoaders 能够订阅 Uri 通知),框架通过加载器实现同步性。恕我直言,无论何时需要数据库,大多数时候使用内容提供程序和加载程序是您能想到的最佳解决方案。

其他涉及直接使用数据库的场景,将迫使您手动实现一切。

关于android - 加载器框架与普通 AsyncTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12837572/

有关android - 加载器框架与普通 AsyncTask的更多相关文章

  1. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  2. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  3. ruby-on-rails - 使用 config.threadsafe 时从 lib/加载模块/类的正确方法是什么!选项? - 2

    我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co

  4. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

  5. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  6. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  7. ruby - sinatra 框架的 MVC 模式 - 2

    我想开始使用“Sinatra”框架进行编码,但我找不到该框架的“MVC”模式。是“MVC-Sinatra”模式或框架吗? 最佳答案 您可能想查看Padrino这是一个围绕Sinatra构建的框架,可为您的项目提供更“类似Rails”的感觉,但没有那么多隐藏的魔法。这是使用Sinatra可以做什么的一个很好的例子。虽然如果您需要开始使用这很好,但我个人建议您将它用作学习工具,以对您来说最有意义的方式使用Sinatra构建您自己的应用程序。写一些测试/期望,写一些代码,通过测试-重复:)至于ORM,你还应该结帐Sequel其中(imho

  8. ruby-on-rails - 使用 gmaps4rails 动态加载谷歌地图标记 - 2

    如何只加载map边界内的标记gmaps4rails?当然,在平移和/或缩放后加载新的。与此直接相关的是,如何获取map的当前边界和缩放级别? 最佳答案 我是这样做的,我只在用户完成平移或缩放后替换标记,如果您需要不同的行为,请使用不同的事件监听器:在你看来(index.html.erb):{"zoom"=>15,"auto_adjust"=>false,"detect_location"=>true,"center_on_user"=>true}},false,true)%>在View的底部添加:functiongmaps4rail

  9. ruby-on-rails - 是否可以让 ActiveRecord 为使用 :joins option? 加载的行创建对象 - 2

    我需要做这样的事情classUser'User',:foreign_key=>'abuser_id'belongs_to:gameendclassGame['JOINabuse_reportsONusers.id=abuse_reports.abuser_id','JOINgamesONgames.id=abuse_reports.game_id'],:group=>'users.id',:select=>'users.*,count(distinctgames.id)ASgame_count,count(abuse_reports.id)asabuse_report_count',:

  10. ruby - 运行 rackup private_pub.ru -s thin -E production 命令时无法加载此类文件 -- thin (LoadError) - 2

    我指的是pubrailscasttutorial并已正确执行所有步骤,但在运行最后一个命令时,即rackupprivate_pub.ru-sthin-Eproduction为了架设faye服务器,我收到以下错误:/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in`require':cannotloadsuchfile--thin(LoadError)from/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in`require'from/var/lib/gems/1.9.1/gems

随机推荐