在我的应用中,我有一个+/- 10页的ViewPager。首次打开应用程序时,将实例化所有页面并立即开始加载要显示的数据。每个页面(它们是片段)都会创建一个AsyncTask来查询数据库并使用适当的数据填充自己。这就是问题所在:即使工作是在不同的线程上完成的,UI也会在数据库查询期间停止更新(按顺序完成,总共花费1-3秒)。这种情况发生在我的Nexus 5和蹩脚的旧三星手机上,所以我知道问题不在于硬件无法跟上。
所以最终,我想知道为什么UI线程被后台线程完成的工作阻止了。我对线程的理解是,在一个线程上工作不会在很长一段时间内阻止另一个线程。如果我的理解是错误的,请解释如何。提前谢谢。
我认为这里不需要代码,但如果是,请告诉我,我会发布相关部分。
答案 0 :(得分:3)
在第一次数据库查询开始后立即停止动画,并在最后一次数据库查询完成后立即再次开始动画
然后,您可能无法在您认为自己的后台线程上进行工作。您可能正在主应用程序线程上进行工作。
Traceview可以帮助您识别您在各种线程上执行的操作,StrictMode
可以帮助您解决明显的问题(主应用程序线程上的磁盘I / O和网络I / O)。
在这种情况下,您可能会被自己的工作方式所困扰:
每个页面(它们是片段)创建一个AsyncTask来查询数据库并用适当的数据填充自己。
如果您在doInBackground()
中进行查询但未触及Cursor
中生成的doInBackground()
,则查询实际上尚未完成。 Cursor
是SQLiteCursor
,并且在首次使用数据时它会延迟执行查询。这是另一个“非常酷的想法,只是简单地说我们现在做的事情”。解决方法是在getCount()
时调用Cursor
上的doInBackground()
,以确保查询实际在后台线程上执行。