Android SQLite交互最佳实践
在UI线程上进行Android SQLite交互最佳实践,android,sqlite,Android,Sqlite,在UI线程上进行SQLite交互可以吗?? 将与SQLite的交互嵌入服务(AsyncTask或IntentService)中是一种最佳实践,还是我们应该为SQLite使用CursorLoader 1) 如果我使用IntentService返回一个用户定义对象的列表,那么我该怎么做呢。我们应该使用broadcastReceiver并将对象列表作为Parcelable对象的ArrayList放在意图中,然后将其发送回UI线程 2) 如果我必须使用游标加载器,那么我需要通过扩展AsyncTaskLo
SQLite
交互可以吗??将与SQLite的交互嵌入服务(
AsyncTask
或IntentService
)中是一种最佳实践,还是我们应该为SQLite
使用CursorLoader
1) 如果我使用IntentService
返回一个用户定义对象的列表,那么我该怎么做呢。我们应该使用broadcastReceiver
并将对象列表作为Parcelable
对象的ArrayList
放在意图中,然后将其发送回UI线程
2) 如果我必须使用游标加载器,那么我需要通过扩展AsyncTaskLoader
和重写doInBackGround
方法为SQLite
编写自定义加载器,在其中添加所需的代码
请建议我哪一种方法更好,因为我是android新手,如果有人有代码,也可以分享它在UI线程上使用SQLite非常好。不需要添加所有服务和寓言内容,除非您打算滚动浏览大量数据 尽管您可以在UI线程上访问数据库并立即更新视图。 应该避免这种做法&在助手线程上进行数据库访问,即对工作线程使用异步任务/服务,即使操作花费的时间少于5秒。在android中,当线程完成任务后,您可以始终使用非UI-to-UI线程通信机制来更新视图。 请参阅此链接以了解有关非UI到UI线程通信机制的基础知识。 我通常使用在活动/服务上创建的异步任务访问数据库。
如果android后来决定不允许在UI线程上访问DB,那么如果DB访问已经在非UI线程上,那么您的代码就不需要返工。 android的历史记录表明,之前在UI线程上允许网络访问,但现在如果您将targetSDKversion设置为11,则应用程序将抛出NetworkOnMainThreadException&exit。
因此,最好在非UI线程上进行DB访问。当使用带有
游标或适配器的ListView
时,如果数据量“巨大”或只有几百行,实际上没有什么区别,我花了很多时间尝试使用intent服务,然后也尝试使用SQLiteCursorLoader,但发现很难实现。感谢您提供的信息,我有一个问题,哪一个更适合AsyncTask或IntentService。当您使用AsyncTask时,如果方向发生变化,它不会受到影响。我认为您无法将网络访问与访问内部数据库进行比较。网络访问从来就不是要在UI线程上运行的,只是从版本11开始,它显式地检查它没有运行。至于数据库访问——需要5秒钟的查询是相当罕见的。仅仅存储一个条目或更新一个字段通常只需要几毫秒,所以大多数情况下,它不值得涉及不同线程的开销。