在我的应用程序中,我需要很多 CRUD 内容:从本地 SQLite 数据库读取记录、插入对象和更新内容。大多数查询都非常简单,即使在 UI 线程上运行它们也不会阻塞,但是在这个应用程序中,我想采用 Windows Phone 模式:输出动画立即开始,当结果传递时开始动画。
我计划使用一个AsyncTask
来完成这项工作,但是我注意到 Honeycomb(和 compat 包)引入了这个新的Loader 框架。主要优势似乎是Loader
生存配置更改加载的数据。Commonsware的LoaderEx项目在 SQLite 和框架之间架起了桥梁,但出现了一些问题。
资源清理:我使用单个活动,在其中创建 SQLiteOpenHelper
onCreate()
并关闭它onDestroy()
。由于加载器管理器可能仍在运行,我检查它并pendingClose
在我的回调对象上设置一个标志,因此它会在加载完成时关闭游标和助手。我认为不关闭数据库是无害的,但如果你不这样做,SQLite 会抱怨,而且我不喜欢错误消息 :) 这里的重点是数据无法在配置更改后继续存在,因此 Loader 的优势消失了我应该创建多少个加载器?假设我有心爱的
Customer
人和Order
桌子。加载程序由ID
'likeCUST_L
或标识ORD_L
,但每次用户单击一些摘要时,我都想带入一个包含详细信息的屏幕。我应该restart
使用不同参数的加载器,还是应该init
使用随机 ID 的新加载器?这可能会发生数十次。Loader 框架是为大量运行中的小型作业设计的,还是只为一些长时间运行的任务而设计的?在界面中使用
ID
's的目的是什么?LoaderCallbacks
为什么不简单initLoader(params, callback)
?我不认为可以在回调中重用某些逻辑:最终他将分支(带有if-else
或switch
在 ID 上)所以我不明白为回调对象提供标识符的意义,而不是一种天真的方法-每次操作的回调。
我问这个是因为整个框架对我来说似乎过度设计并且没有真正的实用性。我不明白用 a 集中代码的意义LoaderManager
,而且我看不到任何AsyncTask
没有提供的新机会。
唯一的胜利点是配置更改生存,但由于资源清理,我无法利用它,而且我无法找到关闭它的替代方法,SQLiteOpenHelper
因为(很明显)SQLiteCursorLoader
需要它但清理它取决于用户。所以AsyncTask
这里似乎是获胜者的选择,但也许我错过了一些东西。