gpt4 book ai didi

android - 为什么在单独的线程上完成工作时 UI 线程会被阻塞?

转载 作者:太空狗 更新时间:2023-10-29 12:41:19 26 4
gpt4 key购买 nike

在我的应用程序中,我有一个包含 +/- 10 页的 ViewPager。当应用程序首次打开时,所有页面都被实例化并立即开始加载数据以显示。每个页面(都是 fragment )创建一个 AsyncTask 来查询数据库并用适当的数据填充自身。这就是问题所在:即使工作是在单独的线程上完成的,UI 在数据库查询期间停止更新(按顺序完成,总共需要 1-3 秒)。这种情况在我的 Nexus 5 和一部破旧的三星手机上都会发生,所以我知道问题不在于硬件跟不上。

所以最终,我想知道为什么 UI 线程会被在后台线程上完成的工作阻塞。我对线程的理解是,在一个线程上工作不会长时间阻塞另一个线程。如果我的理解是错误的,请解释如何。提前致谢。

我认为这里不需要代码,但如果需要,请告诉我,我会发布相关部分。

最佳答案

It stops animating immediately after the first database query begins and starts animating again immediately after the last database query completes

那么,您可能并没有像您认为的那样在后台线程上进行工作。您可能正在主应用程序线程上进行工作。

Traceview 可以帮助您确定您在各个线程上执行的操作,并且 StrictMode可以帮助您解决明显的问题(主应用程序线程上的磁盘 I/O 和网络 I/O)。

在这种情况下,您可能会被自己的工作方式所困扰:

Each page (which are fragments) creates an AsyncTask to query a database and populate itself with the appropriate data.

如果您在 doInBackground() 中进行查询但没有触及结果 Cursor doInBackground() ,查询实际上还没有完成。 CursorSQLiteCursor ,它会在首次使用数据时延迟执行查询。这是另一个“非常酷的想法,只是简单地吸收了我们现在做事的方式”。解决方法是调用 getCount()Cursor 上当你在 doInBackground() , 以确保查询实际上是在后台线程上执行的。

关于android - 为什么在单独的线程上完成工作时 UI 线程会被阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25222980/

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