11

По различным причинам, мне нужно runOnUiThread() фактическая инстанция & инициализация WebView.Можно ли отделить потоки пользовательского интерфейса WebView и HTTP?

Это означает, что его базовые HTTP-соединения также выполняются в потоке пользовательского интерфейса?

Если это так, можно ли отделить веб-интерфейс WebView от потока HTTP-соединений?

Если возможно, каков правильный способ достижения этого?

ответ

11

Я нахожу это очень трудно поверить, что Android будет запускать удаленные HTTP-запросы в потоке пользовательского интерфейса, предполагая, что вы инициируете запросы через WebView.loadUrl(). Это создаст ужасный пользовательский интерфейс.

Просто быстро я запустил приложение Android в отладчике с базовым WebView и остановился в отладчике. Вот что я вижу:

enter image description here

Если WebViewCoreThread, WebViewWorkerThread или http0 - http3 не обработки сетевых подключений для WebView объектов, а затем

  1. Они имеют очень плохие имена
  2. Android строится очень плохо

Кроме того, если вы посмотрите на этот ответ одним из самых известных пользователей переполнения стека, loadUrl() is asynchronous. Быстрый шаг в отладчике говорит мне, что loadUrl(), который вызывается в потоке пользовательского интерфейса (aka main), слишком быстро завершает работу для синхронного соединения в потоке пользовательского интерфейса. (Я поставил точку останова до и после вызова loadUrl() с URL-адресом, который, как я знаю, не поддерживается очень быстро).

Итак, мой ответ все готово ... они уже раздельны! (да!)

+0

То, что вы говорите, имеет смысл, но в моем переопределенном loadUrl() Я фактически регистрирую идентификатор потока (используя 'android.os.Process.myTid()'), и это точно такой же поток id как пользовательский интерфейс **. Я что-то упускаю? Вы говорите, что фактические HTTP-запросы сделаны в потоках с именем 'http0' -' http3'? Есть ли способ * для меня * регистрировать фактические идентификаторы потоков в приложении для этих потоков HTTP? Благодарю. –

+0

@BillTheApe, вы правы. 'loadUrl()' вызывается в потоке пользовательского интерфейса. Это ожидалось. Но что происходит (скорее всего) в том, что внутри реализации Android loadUrl() 'он принимает URL-адрес (объект' String' или 'URL') и помещает его в потокобезопасную очередь. Как только это будет сделано, 'loadUrl()' завершает работу и возвращает управление вызывающему потоку (например, потоку пользовательского интерфейса). Затем выполняется другой поток (а не поток пользовательского интерфейса) и извлекает URL-адрес из потоковой очереди и использует его для открытия соединения с веб-сервером. Затем он извлекает данные и, наконец, ... – Nate

+0

... уведомляет поток пользовательского интерфейса, чтобы отобразить извлеченный контент в 'WebView'. Я не знаю, что это точно **, как это работает, но это пример, когда сетевая активность обрабатывается в потоке, отличном от UI, но ваш эксперимент по-прежнему показывает, что 'loadUrl()' вызывается в пользовательском интерфейсе нить. Ключ состоит в том, что к моменту завершения 'loadUrl()' 'WebView, вероятно, не имеет всего содержимого, фактически отображаемого на экране (или даже извлеченного из сети). Имеет ли это смысл? – Nate

Смежные вопросы