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