其他分享
首页 > 其他分享> > android-为什么在单独的线程上完成工作时UI线程会被阻塞?

android-为什么在单独的线程上完成工作时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(),以确保查询实际上是在后台线程上执行的.

标签:multithreading,android-asynctask,android
来源: https://codeday.me/bug/20191121/2051437.html