首页 > 解决方案 > Activity.runOnUiThread(Runnable runnable) 没有帮助 Choreographer 错误

问题描述

我有一个应用程序,我收到的消息Choreographer: Skipped ## frames! The application may be doing too much work on its main thread.##一个两位数的数字,通常在40或左右50。查看这个问题的堆栈溢出,我找到了一个很好的答案:应用程序可能在其主线程上做了太多工作。该答案中的一部分指出:

如何解决它

解决这个问题需要识别存在或可能发生长时间处理的节点。最好的方法是在与主 UI 线程分开的线程中进行所有处理,无论线程大小。因此,无论是从 SQLite 数据库访问数据,还是进行一些核心数学运算,或者只是对数组进行排序——在不同的线程中进行

由于我的应用程序涉及使用扩展WebView为 display的类LaTeX,我假设获取WebView主线程上的信息是导致问题的原因。但是,这涉及操纵View导致错误的 s Only the original thread that created a view hierarchy can touch its views。上面链接的问题的答案也有一段:

现在这里有一个问题,您将创建一个新线程来执行这些操作,当您运行应用程序时,它会崩溃,说“只有创建视图层次结构的原始线程才能触摸它的视图”。你需要知道这个事实,android 中的 UI 可以由主线程或 UI 线程更改。尝试这样做的任何其他线程都会失败并因此错误而崩溃。您需要做的是在 runOnUiThread 中创建一个新的 Runnable,并且在这个 runnable 中您应该执行所有涉及 UI 的操作。在这里找到一个例子。

但是,Activity.runOnUiThread(Runnable runnable)据说是在UI线程上运行的,后来研究发现UI线程和主线程是一样的,所以在我使用的时候,根本没有用。所以,我的问题是,如果我想WebView在不同的线程上初始化/加载 a 以避免减慢我的应用程序,我该如何实现呢?

注意:我也尝试过使用AsyncTask来实现这一点,但它也会减慢主线程的速度(我知道AsyncTask执行是我尝试时减慢主线程的原因,因为当我删除它时,没有Choreographer错误) . 此外,AsyncTask已弃用,无论如何我都想避免它。

标签: javaandroidmultithreading

解决方案


我已经解决了我自己的问题。进行更多调试后,我发现KaTeXView.setText(String text)KaTeXView扩展WebView)导致了该Choreographer消息。通过使用WebView.post(Runnable runnable),该Choreographer消息不再出现。:)


推荐阅读