- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在我的应用程序中,我有一个包含 +/- 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()
,查询实际上还没有完成。 Cursor
是 SQLiteCursor
,它会在首次使用数据时延迟执行查询。这是另一个“非常酷的想法,只是简单地吸收了我们现在做事的方式”。解决方法是调用 getCount()
在 Cursor
上当你在 doInBackground()
, 以确保查询实际上是在后台线程上执行的。
关于android - 为什么在单独的线程上完成工作时 UI 线程会被阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25222980/
我是一名优秀的程序员,十分优秀!