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

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

概述在我的应用程序中,我有一个带有/-10页的ViewPager.首次打开该应用程序时,所有页面都会实例化,并立即开始加载要显示的数据.每个页面(都是片段)都创建一个AsyncTask来查询数据库,并使用适当的数据填充自身.这就是问题所在:即使工作是在单独的线程上完成的,UI也会在数据库查询期间停止

在我的应用程序中,我有一个带有/-10页的VIEwPager.首次打开该应用程序时,所有页面都会实例化,并立即开始加载要显示的数据.每个页面(都是片段)都创建一个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()中进行查询,但在doInBackground()中也未触及生成的Cursor,则查询实际上尚未完成.游标是一个sqliteCursor,在首次使用数据时它会懒执行查询.这是“那些非常酷的想法,只是在当今我们的工作方式中很烂”.一种解决方法是在doInBackground()中时在游标上调用getCount(),以确保查询实际上是在后台线程上执行的.

总结

以上是内存溢出为你收集整理的android-为什么在单独的线程上完成工作时UI线程会被阻塞?全部内容,希望文章能够帮你解决android-为什么在单独的线程上完成工作时UI线程会被阻塞?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1077923.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存