我搜索过,但找不到任何具体这个问题的答案;所以这里。
我知道我不应该从UI线程访问数据库。此外,AsyncTask不适合较长时间的任务(内存泄漏等)。所以我猜我应该使用一项服务。
我应该在新线程中将SqliteOpenHelper作为服务打开吗?你有任何关于如何做这个的示例代码吗?
SQLiteOpenHelper是否会在Android的另一个线程中自动运行?我没有找到任何没有在UI线程上运行SQLiteOpenHelper的在线示例代码。这是为什么?
谢谢!
答案 0 :(得分:1)
SQLiteOpenHelper是否会由Android自动在另一个线程中运行?
在Java中,对象不在线程上运行。在线程上调用方法。
我不知道任何自动使用自己的线程的SQLiteOpenHelper
方法 - 线程管理是调用SQLiteOpenHelper
上的方法的对象的责任。
我没有在网上找到任何没有在UI线程上运行SQLiteOpenHelper的示例代码
在Java中,对象不在线程上运行。在线程上调用方法。
Here is a sample app从后台线程调用getReadableDatabase()
上的SQLiteOpenHelper
等方法。 Here is another such sample app。 Here is yet another sample app。前两个使用AsyncTask
;后者使用常规Thread
和事件总线。
我应该在新线程中将SqliteOpenHelper作为服务打开吗?
SQLiteOpenHelper
不能 Service
,因为Java不支持多重继承,SQLiteOpenHelper
和Service
都是具体的类。
如果您愿意,我们当然欢迎您在SQLiteOpenHelper
内使用Service
的实例。
此外,AsyncTask对于较长时间的任务(内存泄漏等)并不好。
正确使用AsyncTask
不会触发内存泄漏(例如,通过保留的片段管理它)。是否使用AsyncTask
与其他东西(例如,普通线程,IntentService
)的决定更多地基于工作将花费多长时间以及在此之前终止流程的风险工作完成。