java - 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
已弃用,无论如何我都想避免它。
解决方案
我已经解决了我自己的问题。进行更多调试后,我发现KaTeXView.setText(String text)
(KaTeXView
扩展WebView
)导致了该Choreographer
消息。通过使用WebView.post(Runnable runnable)
,该Choreographer
消息不再出现。:)
推荐阅读
- sql - 没有 XML Oracle 的动态透视
- playframework - 2.6 中的 WebSocket
- php - 如何修复“数组索引超出范围?”
- html - 是否显示:内联更改允许在 ap 元素中包装 div
- asp.net-core - 阻止 aspnet 核心 webpack 中间件进行首次运行的 webpack 构建
- node.js - Auth0 + JWT + NodeJS + Express 最终用户身份验证(登录)
- swift4 - 如何使用 swift 4 创建静态库?
- google-bigquery - 使用标准 SQL 数据类型通过 API 在 BigQuery 中创建表
- javascript - JavaScript 和 HTML 没有显示表单验证
- image - ImageResize() 的语法是什么