Runnables 会阻塞 UI 线程吗?

2024-01-01

我试图了解 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 Thread5 毫秒。简单计算5ms * 1000 = 5000ms = 5秒。所以会阻塞Main Thread永久。但如果你有 10 个操作,你只会阻塞 50 毫秒,换句话说,这只是你感觉不到的负载的 1%。

所以可能的调用数量取决于View、渲染的难度以及设备的速度。

附:对于高手来说AsyncTask- 之间没有真正的区别runOnUiThread and AsyncTask因为那1000Runnables将执行于Main Thread以同样的方式。

即使我在 Activity 的 onCreate 方法中执行相同的操作也会严重阻塞 UI

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Runnables 会阻塞 UI 线程吗? 的相关文章