11

विभिन्न कारणों से, मुझे runOnUiThread() वास्तविक तत्काल & WebView की आरंभिकता की आवश्यकता है।क्या वेबव्यू के UI और HTTP थ्रेड को अलग करना संभव है?

जिसका अर्थ है कि इसके अंतर्निहित HTTP कनेक्शन UI थ्रेड पर भी किए गए हैं?

यदि यह सत्य है, तो वेब कनेक्शन के यूआई थैड को HTTP कनेक्शन थ्रेड से अलग करना संभव है?

यदि यह संभव है, तो इसे पूरा करने का सही तरीका क्या है?

उत्तर

11

मुझे यह बहुत लगता है कि एंड्रॉइड यूआई थ्रेड पर रिमोट HTTP अनुरोध चलाएगा, मानते हैं कि आप WebView.loadUrl() के माध्यम से अनुरोध शुरू करते हैं। यह एक भयानक उपयोगकर्ता अनुभव के लिए बना देगा।

बस जल्दी, मैंने डीबगर में एक एंड्रॉइड ऐप चलाया, मूल WebView के साथ, और डीबगर में रुक गया। यहाँ मैं क्या देख रहा है:

enter image description here

तो WebViewCoreThread, WebViewWorkerThread, या http0 - http3WebView वस्तुओं के लिए नेटवर्क कनेक्शन से निपटने नहीं कर रहे हैं, तो

  1. वे बहुत बुरा नाम है
  2. एंड्रॉयड वास्तव में बुरी तरह बनाया गया है

साथ ही, यदि आप इस जवाब को स्टैक ओवरफ़्लो के उच्चतम प्रतिष्ठा उपयोगकर्ताओं में से एक द्वारा देखते हैं, loadUrl() is asynchronous। डीबगर में एक त्वरित कदम मुझे बताता है कि loadUrl(), जिसे यूआई थ्रेड (उर्फ main) पर कहा जाता है, यूआई थ्रेड पर कनेक्शन को सिंक्रनाइज़ करने के लिए कनेक्शन को बहुत तेज़ करता है। (मैंने loadUrl() पर कॉल के पहले और बाद में एक यूआरएल के साथ एक ब्रेकपॉइंट लगाया जो मुझे पता है कि बहुत जल्दी से परोसा नहीं जाता है)।

तो, मेरा उत्तर है जो आप कर चुके हैं ... वे पहले से ही अलग हैं! (हाँ!)

+0

आप जो कह रहे हैं वह समझ में आता है लेकिन मेरे ओवरराइड लोड यूआरएल() में मैं वास्तव में थ्रेड आईडी लॉग करता हूं ('android.os.Process.myTid()' का उपयोग करके) और यह ** बिल्कुल वही धागा है यूआई के ** के रूप में आईडी। क्या मैं कुछ भूल रहा हूँ? क्या आप कह रहे हैं कि वास्तविक HTTP अनुरोध 'http0' -' fansp3' नामक धागे पर किए गए हैं? क्या इन HTTP धागे के लिए आवेदन में वास्तविक थ्रेड आईडी लॉग करने के लिए * मेरे लिए कोई तरीका है? धन्यवाद। –

+0

@ बिलथीएप, आप सही हैं। यूआई थ्रेड पर 'loadUrl() 'कहा जाता है। यह उम्मीद है। लेकिन, क्या होता है (सबसे अधिक संभावना) यह है कि 'loadUrl() 'के एंड्रॉइड के कार्यान्वयन के अंदर, यह यूआरएल (एक' स्ट्रिंग' या 'यूआरएल' ऑब्जेक्ट) लेता है और इसे थ्रेड-सुरक्षित कतार में रखता है। जैसे ही यह हो जाता है, 'loadUrl()' पूरा हो जाता है, और कॉलिंग थ्रेड (जैसे UI थ्रेड) पर नियंत्रण देता है। फिर, एक और थ्रेड (यूआई थ्रेड नहीं) थ्रेड-सुरक्षित कतार से यूआरएल के माध्यम से आता है और उसे वेबसर्वर से कनेक्शन खोलने के लिए उपयोग करता है। इसके बाद यह डेटा पुनर्प्राप्त करता है, और अंत में ... – Nate

+0

... 'वेब व्यू' में पुनर्प्राप्त सामग्री को प्रस्तुत करने के लिए यूआई थ्रेड को सूचित करता है। मुझे नहीं पता कि यह ** बिल्कुल ** यह कैसे काम करता है, लेकिन यह एक उदाहरण है जिससे नेटवर्क गतिविधि गैर-यूआई थ्रेड पर संभाली जाती है, लेकिन आपका प्रयोग अभी भी दिखाता है कि यूआई पर 'loadUrl() 'कहा जाता है धागा। कुंजी यह है कि जब तक loadUrl() 'पूरा हो जाता है, तो 'WebView' में वास्तव में स्क्रीन पर प्रदान की जाने वाली सभी सामग्री नहीं होती है (या नेटवर्क से भी पुनर्प्राप्त)। क्या इसका कोई मतलब है? – Nate

संबंधित मुद्दे