android开发 WebViewjava.lang.Throwable: A WebView method was called on thread 'JavaBridge'. All WebVie

本文介绍了解决JS调用Java方法刷新WebView时出现的线程错误问题。通过确保所有WebView相关操作都在主线程上执行的方法,成功解决了跨线程调用导致的问题。

项目中用到java和js交互,js调用java方法,让webView刷新网页,异常信息如下:

java.lang.Throwable: A WebView method was called on thread 'JavaBridge'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 1) {c44f280} called on Looper (JavaBridge, tid 26651) {a2bc55}, FYI main Looper is Looper (main, tid 1) {c44f280})

解决办法:
在Activity里面的调用方法执行代码采用这种方式写:

 /**
     * 刷新webView 我的商品
     */
    public void refreshWebViewGoods() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                goods.refurbishWebViewGoods();
            }
        });
    }
该异常信息 `java.lang.Throwable: the expensive method should not be called inside the highlighting pass` 通常出现在使用 IntelliJ IDEA 或基于其平台的 IDE(如 Android Studio)进行插件开发或代码分析时。该提示表明在代码高亮处理阶段调用了性能开销较大的方法,这可能导致 IDE 在渲染代码时出现卡顿或响应迟缓的情况。 ### 异常原因 在 IntelliJ 平台中,代码高亮处理是一个频繁触发的过程,用于在编辑器中动态地为代码添加语法高亮、错误提示、快速修复等功能。如果在此阶段执行了耗时操作,例如文件 I/O、网络请求、复杂的计算逻辑等,会导致编辑器性能下降,影响用户体验。 平台会通过抛出 `java.lang.Throwable` 的特定子类或直接中断操作来提示开发者避免在该阶段执行昂贵操作[^1]。 ### 解决方法 1. **延迟执行昂贵操作** 将耗时操作从高亮处理流程中移除,改用异步方式或延迟加载机制。例如可以使用 `com.intellij.util.ui.update.UiUpdater` 或 `com.intellij.openapi.application.ApplicationManager` 提交到后台线程执行: ```java ApplicationManager.getApplication().executeOnPooledThread(() -> { // 执行昂贵操作 }); ``` 2. **缓存计算结果** 如果昂贵方法的结果可以在高亮处理之外的阶段预计算并缓存,则应在高亮阶段仅使用缓存值,避免重复计算。 3. **使用轻量级替代方法** 替换原本的昂贵方法为轻量级版本,例如将完整的 AST 遍历替换为局部节点检查,或将完整的类型解析替换为快速符号匹配。 4. **利用 PSI 性能优化接口** 在 IntelliJ 平台中,可以使用 `PsiElementVisitor` 的轻量级实现,或使用 `PsiTreeUtil` 提供的高效查找方法来替代递归遍历整个 PSI 树。 5. **使用 HighlightVisitor 的 before/after 模式** 如果自定义的高亮逻辑必须依赖某些昂贵数据,可以考虑在 `HighlightVisitor` 的 `analyze()` 方法中预加载所需数据,并在 `visit()` 方法中仅使用已加载的数据进行高亮处理。 ### 示例代码:异步加载数据以避免阻塞高亮阶段 ```java public class MyHighlightVisitor extends PsiElementVisitor { private volatile MyData cachedData; public void analyze(PsiFile file) { // 异步加载数据 ApplicationManager.getApplication().executeOnPooledThread(() -> { cachedData = computeExpensiveData(file); }); } @Override public void visitElement(PsiElement element) { if (cachedData != null) { // 使用缓存数据进行高亮处理 if (cachedData.contains(element)) { // 应用高亮 } } } private MyData computeExpensiveData(PsiFile file) { // 实现昂贵计算逻辑 } } ``` ### 调试建议 - 使用 IntelliJ 平台提供的性能分析工具(如 CPU Profiler)定位具体是哪个方法导致了性能瓶颈。 - 启用 `idea.is.internal.mode` 系统属性以获取更详细的日志输出,帮助定位高亮阶段的性能问题。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值