在我的应用程序中,我需要很多CRUD东西:从本地sqlite数据库读取记录,插入对象和更新东西.大多数查询都非常简单,即使在UI线程上运行它们也不会阻塞,但是在这个应用程序中我想采用Windows Phone模式:一个out动画立即开始,动画在结果传递时开始动画.
我计划使用AsyncTask来完成这项工作,但是我注意到Honeycomb(以及compat包)引入了这个新的Loader框架.主要优势似乎是Loader加载的数据在配置更改后仍然存在. Commonsware的LoaderEx项目在sqlite和框架之间架起了桥梁,但是出现了一些问题.
>资源清理:我使用单个活动,在onCreate()中创建sqliteOpenHelper并将其关闭onDestroy().由于加载程序管理器可能仍在运行,我检查它并在我的回调对象上设置pendingClose标志,因此它将在加载完成时关闭游标和帮助程序.我认为不关闭数据库是没有害处的,但sqlite抱怨如果你不这样做,我不喜欢错误消息:)这里的重点是数据不能在配置更改中存活,因此Loader优势消失
>我应该创建多少个装载机?假设我拥有心爱的客户和订单表.装载程序由ID识别为CUST_L或ORD_L标识,但每次用户点击某些摘要时我都要带一个带有详细信息的屏幕.我应该restart
一个装有不同参数的装载机,还是应该init
一个带有随机ID的新装载机?这可能会发生几十次. Loader框架是针对许多小型运行的作业,还是仅针对一些长时间运行的任务?
>在LoaderCallbacks界面中使用ID的目的是什么?为什么不是一个简单的initLoader(params,callback)?我不认为可以在回调中重用一些逻辑:最终他将分支(使用if-else或开启ID)所以我不明白给回调对象赋予标识符的意义,而不是天真的方法一次回调 – 每次操作.
我问这个是因为整个框架似乎对我来说过于工程化而没有实际效用.我不明白使用LoaderManager集中代码的意义,我看不到AsyncTask没有提供的任何新机会.
唯一的胜利点是配置改变生存,但我无法利用它,因为资源清理,我无法想出一个关闭sqliteOpenHelper的替代方法,因为(很明显)SQLiteCursorLoader
需要它,但清理它是up up给用户.所以AsyncTask似乎是这里的赢家选择,但也许我错过了一些东西.
> LoaderManager尝试通过ID来区分加载器(这是initLoader的签名指定此参数的原因).如果已经存在具有特定ID的加载器的数据(因此不需要再次异步重新加载),则需要加载器的ID来重新传递缓存结果.
> restartLoader调用强制LoaderManager启动先前创建的加载程序指定的异步操作. initLoader尝试在创建新加载器之前重用现有加载器.
>片段和活动有自己的LoaderManagers不重叠.
我的经验表明,即使使用内容提供商听起来有点矫枉过正,但实际上它在未来的表现相当不错.性能损失是微不足道的(尝试测量它),UI-Data绑定是开箱即用的(因为内容观察者和CursorLoaders能够订阅Uri通知),框架通过加载器实现同步.恕我直言,每当需要数据库时,大多数时候使用带有加载器的内容提供商是您可以提出的最佳解决方案.