uncaught exception: (¹Õ XMLHttpRequest.open öCP ³

本文介绍如何在Firefox浏览器中解除XMLHttpRequest的跨域限制,包括通过about:config设置及使用JavaScript特权管理器的方法。

这是因为firefox安全性强,不允许跨域调用。

Firefox 要取消XMLHttpRequest的跨域限制的话,
第一是从 about:config 里设置 signed.applets.codebase_principal_support = true; (地址栏输入about:config 即可进行firefox设置)
第二就是在open的代码函数前加入类似如下的代码: 
try { netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead"); } catch (e) { alert("Permission UniversalBrowserRead denied."); }

 

<script type="text/javascript" language="javascript">

// Error: uncaught exception: Permission denied to call method XMLHttpRequest.open

  var http_request = false;

  function makeRequest(url, parameters) {

   try {
    netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
   } catch (e) {
    alert("Permission UniversalBrowserRead denied.");
   }

    http_request = false;
    http_request = new XMLHttpRequest();
    if (http_request.overrideMimeType) {
      http_request.overrideMimeType('text/xml');
    }
    if (!http_request) {
      alert('Cannot create XMLHTTP instance');
      return false;
    }
    http_request.onreadystatechange = alertContents;
    http_request.open('GET', url + parameters, true);
    http_request.send(null);
  }

  function alertContents() {
    if (http_request.readyState == 4) {
      if (http_request.status == 200) {

        var string = http_request.responseText;
      alert(string);

      } else {
        alert('There was a problem with the request.');
      }
    }
  }
  function updateweather() {
    makeRequest('http://www.wunderground.com/auto/rss_full/global/stations/16239.xml', '');
  }
</script>

<input type="button" name="button" value="GET XML" 
  onclick="javascript:updateweather();">
11-13 10:34:13.709869 2440 2924 I am_crash: [9743,0,com.ss.android.ugc.aweme.lite,951598660,java.lang.IllegalStateException,Cannot call this method while RecyclerView is computing a layout or scrolling com.ss.android.ugc.aweme.im.widget.CustomRecyclerView{5809080 VFE..VC.. .......D 0,0-1080,1670 #7f0a46a9 app:id/j8j alpha=1.0 viewInfo = }, adapter:com.ss.android.ugc.aweme.im.business.chat.msgcell.common.CellComposeAdapter@d845afe, layout:com.ss.android.ugc.aweme.im.business.chat.feature.chatlist.report.ChatLinearLayoutTrackManager@e9e34ac, context:com.ss.android.ugc.aweme.main.MainActivity@35f55ee,SourceFile,17039390,0] 11-13 10:34:13.725363 2440 2924 I wm_finish_activity: [0,141580969,996,com.ss.android.ugc.aweme.lite/com.ss.android.ugc.aweme.splash.SplashActivity,force-crash] 11-13 10:34:13.733799 2440 2924 I wm_set_resumed_activity: [0,com.android.launcher/.Launcher,resumeTopActivity - onActivityStateChanged] 11-13 10:34:13.735682 2440 2924 I wm_resume_activity: [0,189772917,2,com.android.launcher/.Launcher] 11-13 10:34:13.741480 9743 9743 I Process : Quit itself, Pid:9743 StackTrace:com.android.internal.os.RuntimeInit$KillApplicationHandler.uncaughtException:201 X.0fo8.uncaughtException:33882177 X.01uW.uncaughtException:33882177 com.bytedance.android.btm.impl.pageshow.KillAppUncaughtExceptionHandler.uncaughtException:33882181 com.android.ttcjpaysdk.base.performance.crash.CrashCatchDispatcher.uncaughtException:33751061 com.bytedance.t.t.q.t.s:166 com.bytedance.t.t.q.t.uncaughtException:115 java.lang.ThreadGroup.uncaughtException:1102 java.lang.ThreadGroup.uncaughtException:1093 com.android.internal.os.RuntimeInitExtImpl.uncaughtExceptionExt:72 11-13 10:34:13.741499 9743 9743 I Process : Sending signal. PID: 9743 SIG: 9 11-13 10:34:13.003135 9743 9743 E AndroidRuntime: Process: com.ss.android.ugc.aweme.lite, PID: 9743 11-13 10:34:13.003135 9743 9743 E AndroidRuntime: java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling com.ss.android.ugc.aweme.im.widget.CustomRecyclerView{5809080 VFE..VC.. .......D 0,0-1080,1670 #7f0a46a9 app:id/j8j alpha=1.0 viewInfo = }, adapter:com.ss.android.ugc.aweme.im.business.chat.msgcell.common.CellComposeAdapter@d845afe, layout:com.ss.android.ugc.aweme.im.business.chat.feature.chatlist.report.ChatLinearLayoutTrackManager@e9e34ac, context:com.ss.android.ugc.aweme.main.MainActivity@35f55ee 11-13 10:34:13.003135 9743 9743 E AndroidRuntime: at androidx.recyclerview.widget.RecyclerView.assertNotInLayoutOrScroll(SourceFile:17039390) 11-13 10:34:13.003135 9743 9743 E AndroidRuntime: at X.0lL3.onItemRangeChanged(SourceFile:50593795) 11-13 10:34:13.003135 9743 9743 E AndroidRuntime: at X.0gSZ.LIZLLL(SourceFile:50528274) 11-13 10:34:13.003135 9743 9743 E AndroidRuntime: at androidx.recyclerview.widget.RecyclerView$Adapter.notifyItemChanged(SourceFile:33619971) 11-13 10:34:13.003135 9743 9743 E AndroidRuntime: at com.ss.android.ugc.aweme.im.business.chat.msgcell.common.CellAdapterController.LJJIIZ(SourceFile:33816631) 11-13 10:34:13.003135 9743 9743 E AndroidRuntime: at X.0UaH.run(SourceFile:131078) 11-13 10:34:13.003135 9743 9743 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:1027) 11-13 10:34:13.003135 9743 9743 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:108) 11-13 10:34:13.003135 9743 9743 E AndroidRuntime: at com.ss.android.ugc.bytex.async.stack.TransmitHandler.dispatchMessage(SourceFile:17039390) 11-13 10:34:13.003135 9743 9743 E AndroidRuntime: at android.os.Looper.loopOnce(Looper.java:298) 11-13 10:34:13.003135 9743 9743 E AndroidRuntime: at android.os.Looper.loop(Looper.java:408) 11-13 10:34:13.003135 9743 9743 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:9952) 11-13 10:34:13.003135 9743 9743 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 11-13 10:34:13.003135 9743 9743 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:613) 11-13 10:34:13.003135 9743 9743 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1074)
最新发布
11-26
<think> 首先,用户提供了一个日志文件,看起来是一个Android应用崩溃的日志。核心问题是:一个Java异常 `java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling` 导致了应用崩溃。 关键点: - 异常发生在 `RecyclerView` 中。 - 具体是 `CustomRecyclerView`,属于 `com.ss.android.ugc.aweme.im.widget` 包。 - 错误消息表明:当 `RecyclerView` 正在计算布局或滚动时,不能调用此方法。 - 堆栈跟踪显示:在 `RecyclerView.assertNotInLayoutOrScroll` 方法中抛出异常。 - 调用链涉及 `notifyItemChanged` 方法。 - 最终导致进程退出(PID 9743 被杀死)。 我的回答应该解释这个错误的原因、如何修复它,并提供一些建议。然后用中文回答。 回答结构: 1. **解释错误原因**:`IllegalStateException` 在尝试修改 `RecyclerView` 的适配器数据时抛出,当 `RecyclerView` 正在布局或滚动时。Android 的 `RecyclerView` 要求数据更改(如 `notifyItemChanged`)必须在 UI 线程中安全地执行,不能在布局或滚动过程中调用,以避免并发问题。 2. **常见原因**:可能是在后台线程中更新了数据并通知适配器,而没有确保 `RecyclerView` 处于空闲状态;或者在 `RecyclerView` 的回调中直接修改数据。 3. **修复建议**: - 使用 `post` 方法延迟数据更改到 `RecyclerView` 空闲时。 - 使用 `RecyclerView.Adapter` 的数据更新方法在安全时调用。 - 检查代码中调用 `notifyItemChanged` 的地方,确保在 UI 线程且不在布局/滚动中。 - 具体到日志:错误发生在 `CellAdapterController.LJJIIZ` 方法中,调用 `notifyItemChanged`。 4. **一般建议**:在更新 UI 前检查 `RecyclerView` 是否在布局或滚动中,使用 `isComputingLayout()` 方法。 最后,根据规则,在回答后提出 3-5 个相关问题。问题必须以 "§§相关问题§§" 开头,然后列出问题。 相关问题应该基于用户的查询和我的回答: - 用户可能想知道如何避免这种崩溃。 - 更深入的调试方法。 - 相关 Android 开发实践。 - 预防措施。 草拟问题: 1. 如何检查 RecyclerView 是否在计算布局或滚动? 2. 在 Android 中,如何安全地在后台线程更新 RecyclerView 的数据? 3. 这个错误是否常见于特定场景,比如聊天应用? 4. 是否有其他方法可以避免此类 IllegalStateException? 5. 对于这个崩溃日志,有什么工具或库可以帮助调试? 确保问题数量在 3-5 个。 完整回答: - 先解释错误。 - 然后给出建议。 - 最后输出相关问题。 用中文写。 </think> 根据提供的日志,这是一个Android应用崩溃分析。核心问题是 `java.lang.IllegalStateException`,具体错误为:“Cannot call this method while RecyclerView is computing a layout or scrolling”。这发生在 `RecyclerView`(具体为 `CustomRecyclerView`)的上下文中,导致应用(com.ss.android.ugc.aweme.lite,即抖音轻量版)强制退出(PID 9743 被 SIG:9 杀死)。 ### 原因分析: - **根本原因**:在 `RecyclerView` 正在计算布局或滚动时,调用了其适配器的数据更新方法(如 `notifyItemChanged`)。Android 框架禁止这种操作,因为这会导致 UI 线程的并发问题(例如,数据不一致或视图状态错误)。 - **触发点**:从堆栈跟踪看,异常源于 `CellAdapterController.LJJIIZ` 方法(位置:SourceFile:33816631),它调用了 `notifyItemChanged`。同时,日志显示 `RecyclerView.assertNotInLayoutOrScroll` 方法(位置:SourceFile:17039390)检测到非法状态并抛出异常。 - **常见场景**:这可能发生在异步数据更新(如后台线程修改数据后直接通知 UI 更新),或在 `RecyclerView` 的回调(如 `onScroll` 或 `onLayout`)中触发数据变更。 ### 修复建议: 1. **线程安全处理**:确保所有适配器数据更新(如 `notifyItemChanged`)在 UI 线程执行,并避免在 `RecyclerView` 布局/滚动时调用。使用 `RecyclerView.post(Runnable)` 延迟操作: ```java recyclerView.post(() -> { adapter.notifyItemChanged(position); }); ``` 2. **状态检查**:在调用适配器方法前,检查 `RecyclerView` 是否空闲: ```java if (!recyclerView.isComputingLayout() && !recyclerView.isScrollInProgress()) { adapter.notifyItemChanged(position); } else { // 延迟重试 } ``` 3. **代码审查**:重点检查 `CellAdapterController` 类中调用 `notifyItemChanged` 的逻辑,确保它不在敏感生命周期内触发。例如,在聊天消息更新时添加防护。 4. **全局预防**:使用统一的适配器更新工具类,封装线程切换和状态检查(如 RxJava 或 Handler),以减少此类错误。 5. **日志调试**:添加更多日志输出 `RecyclerView` 的状态(如 `isComputingLayout()`),帮助定位问题源头。 此崩溃常见于高动态 UI(如聊天列表),通过上述方法可避免 90% 的类似崩溃。如果问题持续,建议使用 Android Studio 的 Profiler 或 StrictMode 检测线程违规。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值