问题描述
我搜寻了一下,但是找不到这个问题的具体答案; 所以这里去。
我知道我不应该从UI线程访问数据库。 另外,AsyncTask不适用于时间较长的任务(内存泄漏等)。 所以我想我应该利用一项服务。
是否应该在新线程中将SqliteOpenHelper作为服务打开? 您有如何执行此操作的示例代码吗?
SQLiteOpenHelper是否由Android自动在另一个线程中运行? 我没有在线找到没有在UI线程上运行SQLiteOpenHelper的示例代码。 为什么是这样?
谢谢!
1楼
SQLiteOpenHelper是否由Android自动在另一个线程中运行?
在Java中,对象不在线程上运行。 方法在线程上调用。
我不知道任何会自动使用其自己的线程的SQLiteOpenHelper方法-线程管理是在SQLiteOpenHelper上调用方法的对象的责任。
我没有找到任何未在UI线程上运行SQLiteOpenHelper的示例代码
在Java中,对象不在线程上运行。 方法在线程上调用。
, SQLiteOpenHelper从后台线程在SQLiteOpenHelper上调用诸如getReadableDatabase()类的方法。
。
。
前两个使用AsyncTask ;
后者使用带有事件总线的常规Thread 。
是否应该在新线程中将SqliteOpenHelper作为服务打开?
SQLiteOpenHelper不能是 Service ,因为Java不支持多重继承,并且SQLiteOpenHelper和Service都是具体的类。
当然,如果您愿意,也欢迎从Service内部使用SQLiteOpenHelper的实例。
另外,AsyncTask不适用于时间较长的任务(内存泄漏等)。
正确使用AsyncTask不会触发内存泄漏(例如,通过保留的片段进行管理)。
是否使用AsyncTask与其他对象(例如,普通线程, IntentService )的决定更多地取决于工作将花费多长时间以及在工作完成之前终止过程的风险。