11

Vì nhiều lý do khác nhau, tôi cần phải runOnUiThread() việc khởi tạo thực tế & khởi tạo WebView.Có thể tách các giao diện người dùng và HTTP của WebView không?

Điều đó có nghĩa là các kết nối HTTP cơ bản của nó cũng được thực hiện trên luồng giao diện người dùng?

Nếu điều này là đúng, có thể phân tách giao diện người dùng của WebView khỏi chuỗi kết nối HTTP không?

Nếu có thể, cách thích hợp để hoàn thành điều này là gì?

Trả lời

11

Tôi tìm thấy nó rất khó tin rằng Android sẽ chạy yêu cầu HTTP từ xa trên chuỗi giao diện người dùng, giả sử bạn bắt đầu yêu cầu qua WebView.loadUrl(). Điều này sẽ làm cho trải nghiệm người dùng khủng khiếp.

Chỉ cần nhanh chóng, tôi đã chạy ứng dụng Android trong trình gỡ lỗi, với số WebView cơ bản và đã dừng trong trình gỡ lỗi. Đây là những gì tôi thấy:

enter image description here

Nếu WebViewCoreThread, WebViewWorkerThread, hoặc http0-http3 không xử lý các kết nối mạng cho WebView đối tượng, sau đó

  1. Họ có những cái tên rất xấu
  2. Android được xây dựng thực sự tồi tệ

Ngoài ra, nếu bạn nhìn vào câu trả lời này bởi một trong những người dùng danh tiếng cao nhất của chồng tràn, loadUrl() is asynchronous. Một bước nhanh chóng trong trình gỡ rối cho tôi biết rằng loadUrl(), được gọi trên luồng giao diện người dùng (aka main), hoàn tất quá nhanh để kết nối được xử lý đồng bộ trên chuỗi giao diện người dùng. (Tôi đặt điểm ngắt trước và sau khi gọi tới số loadUrl() với URL mà tôi biết không được phân phối rất nhanh).

Vì vậy, câu trả lời của tôi là bạn đã hoàn tất ... chúng đã tách biệt! (yeah!)

+0

Những gì bạn đang nói có ý nghĩa nhưng trong loadUrl đã ghi đè của tôi() Tôi thực sự ghi id chủ đề (sử dụng 'android.os.Process.myTid()') và nó chính xác là cùng một chuỗi id là giao diện người dùng **. Tui bỏ lỡ điều gì vậy? Bạn có nói rằng các yêu cầu HTTP thực tế được thực hiện trên các chủ đề có tên 'http0' -' http3'? Có cách nào * cho tôi * để đăng nhập các id thread thực tế trong ứng dụng cho các chủ đề HTTP? Cảm ơn. –

+0

@BillTheApe, bạn là chính xác. 'loadUrl()' được gọi trên luồng UI. Đó là dự kiến. Nhưng, những gì xảy ra (rất có thể) là bên trong việc thực hiện 'loadUrl() 'của Android, nó lấy URL (một đối tượng' String' hoặc 'URL') và đặt nó vào một hàng đợi an toàn. Ngay khi thực hiện xong, 'loadUrl()' hoàn tất và trả về quyền kiểm soát cho chuỗi gọi (ví dụ: chuỗi giao diện người dùng). Sau đó, một luồng khác (không phải là chuỗi giao diện người dùng) đi qua và truy lục URL từ hàng đợi an toàn của luồng và sử dụng nó để mở một kết nối tới máy chủ web. Sau đó nó lấy dữ liệu, và cuối cùng ... – Nate

+0

... thông báo cho chuỗi giao diện người dùng để hiển thị nội dung đã truy xuất trong 'WebView'. Tôi không biết rằng điều này là ** chính xác ** cách nó hoạt động, nhưng đó là một ví dụ trong đó hoạt động mạng được xử lý trên một chuỗi không phải UI, nhưng thử nghiệm của bạn vẫn cho thấy 'loadUrl()' được gọi trên UI chủ đề. Điều quan trọng là do thời gian 'loadUrl()' hoàn tất, 'WebView' có thể không có tất cả nội dung thực sự được hiển thị cho màn hình (hoặc thậm chí được truy xuất từ ​​mạng). Điều đó có ý nghĩa? – Nate

Các vấn đề liên quan