是否可以分离 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 应用程序,然后在调试器中停止了。这是我看到的:
如果 WebViewCoreThread
、WebViewWorkerThread
或 http0
- 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(String
或 URL
对象)并将其放入线程安全队列中。一旦完成,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 线程?的主要内容,如果未能解决你的问题,请参考以下文章
基于springboot+vue的学生选课系统(前后端分离)