我正在开发一个Android应用程序。每个活动都绑定到用于执行所有实际工作的服务。通常,一切都很好 - 但是当一个包含大约10万个对象的数组作为更新从服务器到达时。
在插入大约10 000个对象之后,DB线程甚至UI线程都会挂起。处理器负载不超过60%,使用的内存小于200 MB。
我在服务的一个单独的线程中完成我的所有数据库工作;我确保不要重载Db队列,从JsonArray中提取对象,以便在DB线程队列中总有大约100个对象。
当带有更新的大数组从服务器作为Json数组到达时,我逐渐将其拆解并分别处理每个对象。
Db队列使用Room访问数据库。
`@Update(onConflict = OnConflictStrategy.FAIL)`
`public abstract void update(User localTransport);`
没有交易。
所有数据库对象的ID都存储在HashMap中,因此我可以选择更新或插入没有开销的行。
这是我的更新功能:
private long doUpdateOrInsert(Sendable s) {
if (Core.core.dbHelper.storage.hasItem(s)) {
dbDao.updateSendable(s);
return s.id;
}
else {
long id = this.dbDao.insert(s);
Core.core.dbHelper.storage.addItem(s,id);
return id;
}
}
拜托,您能告诉我如何解决这个问题吗?为什么我的UI线程挂起?我没有在日志中得到任何异常,除了ANR导致UI没有响应五秒钟和我的日志,我的数据库线程停止处理消息。
编辑:
很抱歉没有明确说明,我的所有工作都是在服务上完成的。它与使用startService()
启动的活动分开,并且与当前活动绑定。 Db Thread由服务中的单独线程运行。
以下是应用程序随机死亡并返回到上一个屏幕的配置文件的屏幕截图,即使我没有触摸手机,甚至没有写任何应用程序日志。
也许尝试使用rxJava进行数据库操作(使用线程调度程序)并使用事件来更新ui
使用IntentService
,以便在后台线程上完成工作。
我尝试创建一个可以上传/下载的线程,但是一旦服务完成,Android就会杀死我的线程。
这就是为什么你应该使用IntentService,因为Android管理后台线程并为你停止服务。你只需通过它发送它
startService()
并在onHandleIntent().
做工作
Service类使用应用程序的主线程,而IntentService创建一个工作线程并使用该线程来运行该服务。