gpt4 book ai didi

android - 即使没有 UI 线程任务、内存和处理器使用都正常,我的 Android 应用程序也会挂起

转载 作者:行者123 更新时间:2023-11-30 05:05:05 25 4
gpt4 key购买 nike

我正在开发一个安卓应用。每个 Activity 都绑定(bind)到一个用于执行所有实际工作的服务。通常情况下,一切都很好 - 但当一个包含大约 100 000 个对象的数组作为更新从服务器到达时就不是这样了。

在插入大约 10000 个对象后,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 在五秒钟内没有响应,并且我的日志显示我的数据库线程停止处理消息。

编辑:

抱歉没有说清楚,我所有的工作都是在服务上完成的。它与 Activity 分开,使用 startService() 启动,并绑定(bind)到当前 Activity 。 Db 线程由服务中的单独线程运行。

以下是应用程序随机死机后性能分析器的屏幕截图,即使我没有触摸手机,也没有向应用程序日志写入任何内容,但仍返回到上一个屏幕。

Threads

Memory

最佳答案

也许尝试使用 rxJava 进行数据库操作(对线程使用调度程序)并使用事件更新 ui

关于android - 即使没有 UI 线程任务、内存和处理器使用都正常,我的 Android 应用程序也会挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54719846/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com