是否可以分离 WebView 的 UI 和 HTTP 线程?

Posted

技术标签:

【中文标题】是否可以分离 WebView 的 UI 和 HTTP 线程?【英文标题】:Is it possible to separate WebView's UI and HTTP threads? 【发布时间】:2012-06-29 04:58:24 【问题描述】:

由于种种原因,我需要runOnUiThread()WebView的实际实例化&初始化。

这意味着它的底层 HTTP 连接也是在 UI 线程上建立的?

如果是这样,是否可以将 WebView 的 UI 主题与 HTTP 连接线程分开?

如果可能,实现此目的的正确方法是什么?

【问题讨论】:

【参考方案1】:

我觉得非常很难相信 android 会在 UI 线程上运行远程 HTTP 请求,假设您通过 WebView.loadUrl() 发起请求。这会导致糟糕的用户体验。

很快,我在调试器中运行了一个带有基本 WebView 的 Android 应用程序,然后在调试器中停止了。这是我看到的:

如果 WebViewCoreThreadWebViewWorkerThreadhttp0 - http3 未处理 WebView 对象的网络连接,则

    他们的名字很糟糕 Android 构建得非常糟糕

此外,如果您查看堆栈溢出的最高声誉用户之一的此答案,loadUrl() is asynchronous。调试器中的快速步骤告诉我,在 UI 线程(又名 main)上调用的 loadUrl() 完成速度太快,无法在 UI 线程上同步处理连接。 (我在调用 loadUrl() 之前和之后都设置了一个断点,并且我知道这个 URL 不会很快提供)。

所以,我的回答是你已经完成了......他们已经分开了!(是的!)

【讨论】:

你说的有道理,但在我重写的 loadUrl() 中,我实际上记录了线程 ID(使用 android.os.Process.myTid()),它与 UI 的线程 ID 完全相同。我错过了什么吗?您是说实际的 HTTP 请求是在名为 http0 - http3 的线程上发出的吗?有没有办法为我记录这些HTTP线程的应用程序中的实际线程ID?谢谢。 @BillTheApe,你是对的。 loadUrl() 在 UI 线程上调用。这是预期的。但是,发生的事情(很可能)是在 Android 的 loadUrl() 实现中,它获取 URL(StringURL 对象)并将其放入线程安全队列中。一旦完成,loadUrl() 就会完成,并将控制权返回给调用线程(例如 UI 线程)。然后,另一个线程(不是 UI 线程)通过并从线程安全队列中检索 URL,并使用它打开到 Web 服务器的连接。然后它检索数据,最后...... ... 通知 UI 线程在WebView 中呈现检索到的内容。我不知道这究竟是如何工作的,但这是一个在非 UI 线程上处理网络活动的示例,但您的实验仍然表明 loadUrl() 在用户界面线程。关键是,当loadUrl() 完成时,WebView 可能还没有实际呈现到屏幕上的所有内容(甚至没有从网络中检索到)。这有意义吗? 因此,总而言之,将loadUrl() 从概念上视为开始网络操作的请求。不是完全包含在数据完成时检索和显示数据的所有工作。 @BillTheApe,对于相关问题,see this other answer I just gave on Android web requests and threading。它应该阐明 Android 工程师究竟想通过他们的实现来实现什么。

以上是关于是否可以分离 WebView 的 UI 和 HTTP 线程?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在材料ui的选择组件中使用分页?

微信小程序实现原理

webview和h5数据传递

基于springboot+vue的学生选课系统(前后端分离)

我可以在WebView中注入什么JavaScript / CSS来仅反转页面背景和白色文本?

逻辑和UI分离