Я нахожу это очень трудно поверить, что Android будет запускать удаленные HTTP-запросы в потоке пользовательского интерфейса, предполагая, что вы инициируете запросы через WebView.loadUrl()
. Это создаст ужасный пользовательский интерфейс.
Просто быстро я запустил приложение Android в отладчике с базовым WebView
и остановился в отладчике. Вот что я вижу:
Если WebViewCoreThread
, WebViewWorkerThread
или http0
- http3
не обработки сетевых подключений для WebView
объектов, а затем
- Они имеют очень плохие имена
- Android строится очень плохо
Кроме того, если вы посмотрите на этот ответ одним из самых известных пользователей переполнения стека, loadUrl() is asynchronous. Быстрый шаг в отладчике говорит мне, что loadUrl()
, который вызывается в потоке пользовательского интерфейса (aka main
), слишком быстро завершает работу для синхронного соединения в потоке пользовательского интерфейса. (Я поставил точку останова до и после вызова loadUrl()
с URL-адресом, который, как я знаю, не поддерживается очень быстро).
Итак, мой ответ все готово ... они уже раздельны! (да!)
То, что вы говорите, имеет смысл, но в моем переопределенном loadUrl() Я фактически регистрирую идентификатор потока (используя 'android.os.Process.myTid()'), и это точно такой же поток id как пользовательский интерфейс **. Я что-то упускаю? Вы говорите, что фактические HTTP-запросы сделаны в потоках с именем 'http0' -' http3'? Есть ли способ * для меня * регистрировать фактические идентификаторы потоков в приложении для этих потоков HTTP? Благодарю. –
@BillTheApe, вы правы. 'loadUrl()' вызывается в потоке пользовательского интерфейса. Это ожидалось. Но что происходит (скорее всего) в том, что внутри реализации Android loadUrl() 'он принимает URL-адрес (объект' String' или 'URL') и помещает его в потокобезопасную очередь. Как только это будет сделано, 'loadUrl()' завершает работу и возвращает управление вызывающему потоку (например, потоку пользовательского интерфейса). Затем выполняется другой поток (а не поток пользовательского интерфейса) и извлекает URL-адрес из потоковой очереди и использует его для открытия соединения с веб-сервером. Затем он извлекает данные и, наконец, ... – Nate
... уведомляет поток пользовательского интерфейса, чтобы отобразить извлеченный контент в 'WebView'. Я не знаю, что это точно **, как это работает, но это пример, когда сетевая активность обрабатывается в потоке, отличном от UI, но ваш эксперимент по-прежнему показывает, что 'loadUrl()' вызывается в пользовательском интерфейсе нить. Ключ состоит в том, что к моменту завершения 'loadUrl()' 'WebView, вероятно, не имеет всего содержимого, фактически отображаемого на экране (или даже извлеченного из сети). Имеет ли это смысл? – Nate