我试图了解 UI 线程的事件队列是如何工作的。我正在尝试运行一个可以分解为多个部分的代码,但不幸的是它必须在 UI 线程上运行。因此,为了不阻塞 UI 线程并收到 ANR,我想知道是否可以在许多情况下破坏该代码Runnable
对象并使用运行它们runOnUiThread
来自另一个线程。
我的问题是,这会阻塞 UI 线程吗?例如,如果我有一段代码肯定会在 5 秒内运行,并且我将这段代码分解为 1000Runnable
对象,并将它们添加到 UI 线程的事件队列中,它们之间的 UI 线程是否会处理其他事件?
Edit:我想我找到了一种更好的方式来表达自己,以防上述解释令人困惑。
- 1000 人
Runnable
对象只是一个例子,在实际代码中我希望最多有 10 个。
- 基本上我想要10个
Runnable
对象,每个对象都在 UI 线程上初始化一个广告网络。我想要这些Runnable
对象一个接一个地运行,而不是并行运行。另外,我希望 UI 线程能够在运行这些对象之间处理其他事件,这样在运行所有 10 个对象时我就不会收到 ANRrun
方法将花费超过 5 秒。
NOTE:我不知道为什么初始化广告网络必须在 UI 线程上完成,但它必须,否则应用程序会崩溃。它还在一些网络 sdks 文档中指出初始化必须在 UI 线程上进行。这就是为什么我需要在 UI 线程上一个接一个地运行它们,并且无法在后台并行运行它们。
此外,该应用程序实际上是一个 OpenGL 游戏,因此调用运行Runnable
对象将从 GL 线程而不是主线程创建,因此它们将被添加到事件队列中,并且不会立即执行。
Well, Runnable
在你的里面runOnUiThread
刚刚运行在Main Thread
.
想象一些简单的动作,比如
textView.setText("example");
将阻塞主线程 5 毫秒。通常你不会看到它。
现在想象一下,您在 5 秒内执行了 1000 次相同的操作。还有每一个街区Main Thread
5 毫秒。简单计算5ms * 1000 = 5000ms = 5秒。所以会阻塞Main Thread
永久。但如果你有 10 个操作,你只会阻塞 50 毫秒,换句话说,这只是你感觉不到的负载的 1%。
所以可能的调用数量取决于View
、渲染的难度以及设备的速度。
附:对于高手来说AsyncTask
- 之间没有真正的区别runOnUiThread
and AsyncTask
因为那1000Runnables
将执行于Main Thread
以同样的方式。
即使我在 Activity 的 onCreate 方法中执行相同的操作也会严重阻塞 UI
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)