2012-03-19 5 views
7

मेरे पास एक उपयोगकर्ता इंटरफ़ेस है जो आंशिक रूप से वेब आधारित (WebView) है। यह Javascript Interface के माध्यम से एंड्रॉइड यूआई से जुड़ा हुआ है। जब आप WebView में किसी तत्व पर टैप करते हैं, तो जावास्क्रिप्ट एंड्रॉइड तक कॉल करता है और एंड्रॉइड जावास्क्रिप्ट/वेब थ्रेड पर कॉल प्राप्त करता है। यूआई (मुख्य) धागा नहीं है।मुख्य धागे से बाहर होने पर, मैं मुख्य थ्रेड पर जितनी जल्दी हो सके चलाने के लिए कुछ कोड कैसे प्राप्त कर सकता हूं?

यह एंड्रॉइड में 1 या उससे कम मिलीसेकंड में आता है। वहां कोई समस्या नहीं है। हालांकि, क्योंकि अब मैं यूआई को बदलना चाहता हूं, मुझे यूआई थ्रेड पर स्विच करना होगा। (यदि आप मुख्य थ्रेड से यूआई को संशोधित करते हैं तो एंड्रॉइड अपवाद फेंकता है)। मैं वर्तमान में यूआई थ्रेड पर हैंडलर का उपयोग कर रहा हूं और post() पर कॉल कर रहा हूं।

यह कोड (एक रननेबल) को बाद में 120 और 300 एमएस के बीच कहीं भी कहा जाता है। यूआई के उपयोगकर्ता के स्पर्श से बदलने के लिए यह एक बहुत ही ध्यान देने योग्य अंतराल है।

क्या यूआई थ्रेड पर चलाने के लिए कुछ कोड प्राप्त करने का कोई तरीका है?

एक इंटरफेस वर्ग:

public class JSInterface { 

    public void test() { 
     // Arrives here in 1ms after calling AndroidInterface.test(). Arrives n the web thread. 

     runOnUiThread(new Runnable() { 

      @Override 
      public void run() { 
       // Arrives here 100ms to 300ms after calling AndroidInterface.test(). Arrives on the main (UI) thread. 
      } 

     }); 

    } 

} 

इस तरह वेब दृश्य करने के लिए जोड़ा गया:

webview.addJavascriptInterface(new JSInterface(), "AndroidInterface"); 

इस तरह जावास्क्रिप्ट में कहा जाता है:

AndroidInterface.test(); 

धन्यवाद यहाँ कुछ उदाहरण कोड है!

उत्तर

6

क्या यूआई थ्रेड पर चलाने के लिए कुछ कोड प्राप्त करने का कोई तरीका है?

runOnUiThread() और किन ने एक संदेश कतार पर एक संदेश दिया कि मुख्य अनुप्रयोग धागा बंद हो जाता है। अधिकांश समय, मुख्य अनुप्रयोग धागा का काम कतार से एक संदेश खींचना और इसे संसाधित करना है। हालांकि, मुख्य एप्लिकेशन थ्रेड आपके अधिकांश कॉलबैक को कॉल करने के लिए भी ज़िम्मेदार है।

  1. कतार काफी बैकलॉग है

  2. मुख्य आवेदन धागा:

    आप देख रहे हैं, तो "120 और 300 एमएस" देरी, कि दो नहीं-परस्पर अनन्य में से एक मतलब कुछ अन्य कोड

WebView के बीच के रिश्ते, कतार, और मुख्य आवेदन धागा बल्कि रहस्यमय है, compar को क्रियान्वित करने में व्यस्त है सामान्य विजेट्स में एड, क्योंकि WebView जावा कोड में प्रस्तुत क्लासिक विजेट नहीं है। इसलिए, मुझे नहीं पता कि आपकी वेब सामग्री में कुछ ऐसा हो रहा है जो इसे समझा सकता है, या यदि यह WebView के लिए काफी सामान्य है। आप सरल वेब सामग्री के साथ एक प्रयोग का प्रयास कर सकते हैं और देख सकते हैं कि आपको समान देरी मिलती है, या यदि देरी आपके द्वारा प्रतिपादित विशिष्ट वेब सामग्री से किसी और तरह से जुड़ी हुई है।

पुश को धक्का देने के लिए आते हैं, Handler और postAtFrontOfQueue() का उपयोग करें। the JavaDocs for that method नोट के रूप में, हालांकि, यह खतरनाक है।

+0

फॉलो अप के रूप में, मैंने यह देखने के लिए ट्रेसव्यू का उपयोग किया कि थ्रेड व्यस्त होने का क्या कारण होगा। सबसे पहले, मुझे एक कस्टम दृश्य मिला जो बहुत सारे पुनर्विचार का कारण बन रहा था।इसे हल करने के बाद, देरी 120ms या उससे कम हो गई। दूसरा, हैंडलरपोस्ट() कॉल एक लंबे 'WebView.nativeDraw()' कॉल (लगभग 60-70ms) के दौरान होता है जिसके बाद अन्य ड्राइंग कॉल की श्रृंखला होती है। चूंकि यह कॉल के दौरान होता है, इसलिए ड्रॉ पूरा होने तक मेरा कोड तब तक नहीं चल सकता है। वेबव्यू ड्रा शायद वेब इंटरफ़ेस में दबाया गया राज्य है। तो ऐसा लगता है कि मैं ड्राइंग अनुकूलित करने के लिए बंद हूँ! धन्यवाद! – cottonBallPaws

+0

इसके अलावा, बस ध्यान दें, इस मामले में 'postAtFrontOfQueue()' केवल 1 या 2ms बचाया गया है, क्योंकि जब पोस्ट किया गया था तो चित्र पहले ही चल रहा था। – cottonBallPaws

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