2012-12-24 12 views
7

में UI को अपडेट करने के तीन तरीकों के बीच अंतर दिखाने के लिए इस उदाहरण कोड को संशोधित करने के लिए मैं UI इंटरैक्शन प्रबंधित करने के लिए तीन विधियों के बीच अंतर को समझने के लिए प्रयास कर रहा हूं।ब्लैकबेरी

वास्तविक मामलों में उन्हें समझने के लिए परीक्षण करते समय मैं इन तीन शर्तों से वास्तव में उलझन में हूं।

नीचे कोड invokeAndWait विधि के समारोह से पता चलता है, लेकिन अगर मैं इसे invokeLater या getEventLock द्वारा की जगह() कार्यक्रम ठीक उसी तरह काम करेंगे।

क्या कोई यूआई अपडेट करने के लिए तीन विधियों के बीच अंतर दिखाने के लिए कोड को संशोधित कर सकता है?

public final class HelloWorldMainScreen extends MainScreen 
{ 
    private LabelField labelField; 
    public HelloWorldMainScreen() 
    {   
     labelField = new LabelField("Hello World");  
     add(labelField); 
     MainScreenUpdaterThread thread = new MainScreenUpdaterThread(this); 
     thread.start(); 
    } 

    public void appendLabelText(String text){ 
     labelField.setText(labelField.getText()+"\n"+text); 
    } 
} 

public class MainScreenUpdaterThread extends Thread { 
    HelloWorldMainScreen mainScreen; 

    public MainScreenUpdaterThread(HelloWorldMainScreen mainScreen){ 
     this.mainScreen = mainScreen; 
    } 

    public void run(){ 
     for (int i = 0; i < 10; i++) { 
      try{ 
       Thread.sleep(5000); 
      }catch(InterruptedException ex){}; 
      UiApplication.getUiApplication().invokeAndWait(new Runnable() { 

       public void run() { 
        mainScreen.appendLabelText("Update");     
       } 
      }); 
     } 
    } 
} 

इन तीन अवधारणाओं कई शुरू कर लोगों को इसलिए किसी भी व्याख्यात्मक स्रोत कोड उनके कार्यों का वर्णन किसी के लिए दृढ़ता से उपयोगी होगा के लिए बहुत भ्रमित कर रहे हैं, मुझे लगता है।

अग्रिम धन्यवाद!

उत्तर

6

तीन अलग अलग तरीकों के लिए मेरे समझ:

  • Application.getEventLock() - घटना के रूप में जल्द से जल्द
  • UiApplication.invokeLater() ताला मिल - घटना कतार में Runnable रखा है और उसे अन्य सभी कार्यों को करने से पहले करने के लिए रखा गया था के बाद निष्पादित किया जाएगा इस कतार
  • UiApplication.invokeAndWait() - धागा बुला रोक दिया जाएगा जब तक Runnable चलाया जाएगा छोड़कर पिछले वाले जैसा

मेरी व्यक्तिगत राय कभी भी पहली विधि का उपयोग नहीं करती है। मुझे नहीं लगता कि मेरे किसी भी ड्रा या यूआई परिवर्तन कार्यों को प्राथमिकता दी जाती है कि अन्य कार्यों को पहले से ही कतार में डाल दिया जाता है।

मैं अधिकतर दूसरी विधि का उपयोग करता हूं और मैंने एक बार आखिरी बार उपयोग किया जब मैंने कुछ मोडल पॉपअप संवाद चयन लागू किया।

2

getEventLock(): एप्लिकेशन उपयोगकर्ता इंटरफ़ेस ईवेंट लॉक पुनर्प्राप्त करता है। वर्कर थ्रेड को इस थ्रेड पर सिंक्रनाइज़ करना चाहिए यदि वे ईवेंट थ्रेड के साथ क्रमबद्ध कोड निष्पादित करना चाहते हैं। आपके कार्यकर्ता धागे को केवल थोड़े समय के लिए लॉक रखना चाहिए, क्योंकि यह क्रिया थ्रेड प्रेषक को रोकती है।

डिवाइस के उपयोगकर्ता इंटरफ़ेस से जुड़े किसी भी ऑपरेशन को लॉक के साथ किया जाना चाहिए। यूआई सिस्टम यह भी गारंटी देता है कि जिस भी तरीके से यह लागू होता है वह उस धागे पर निष्पादित होगा जो पहले से ही लॉक है।

किसी एप्लिकेशन को कभी भी इस ऑब्जेक्ट को सूचित या प्रतीक्षा नहीं करना चाहिए।

invokeLater(): इस एप्लिकेशन की ईवेंट कतार में चलने योग्य ऑब्जेक्ट डालता है। सभी लंबित घटनाओं के संसाधित होने के बाद, प्रेषण थ्रेड पर उस ऑब्जेक्ट की रन() विधि को लागू करने के लिए, एक चलने योग्य ऑब्जेक्ट को पास करने के लिए इस विधि को आमंत्रित करें।

यदि कोई ईवेंट प्रेषण धागा नहीं है (यानी हैइवेन्ट थ्रेड() झूठा रिटर्न), तो कतार को अंतिम आकार को छोड़ दिया जाता है जब कतार अपनी आकार सीमा से अधिक हो जाती है।नोट: यदि किसी एप्लिकेशन में इवेंट थ्रेड नहीं होता है, तो आप रनटाइम सिस्टम को सूचित करने के लिए setAcceptEvents (बूलियन) का आह्वान कर सकते हैं कि एप्लिकेशन अब ईवेंट स्वीकार नहीं करता है। उस एप्लिकेशन के लिए कतारबद्ध सभी घटनाओं को तब त्याग दिया जाता है।

invokeAndWait(): इस एप्लिकेशन की घटना कतार में चलने योग्य वस्तु डालता है, और जब तक यह संसाधित नहीं हो जाता है तब तक प्रतीक्षा करता है। सभी लंबित घटनाओं के संसाधित होने के बाद, प्रेषण थ्रेड पर उस ऑब्जेक्ट की रन() विधि को लागू करने के लिए, एक चलने योग्य ऑब्जेक्ट को पास करने के लिए इस विधि को आमंत्रित करें।

यह विधि तब तक अवरुद्ध हो जाती है जब तक सम्मिलित ईवेंट संसाधित नहीं हो जाता है (यानी, जब तक चलने योग्य ऑब्जेक्ट की रन() विधि वापस नहीं आती)।

इवेंट प्रेषण धागे पर इस विधि को कॉल करना सुरक्षित है। इस मामले में रननेबल तुरंत निष्पादित किया जाएगा।

यदि कोई ईवेंट प्रेषण धागा नहीं है (यानी हैइवेन्ट थ्रेड() झूठा रिटर्न), तो कतार को अंतिम आकार को छोड़ दिया जाता है जब कतार अपनी आकार सीमा से अधिक हो जाती है। नोट: यदि किसी एप्लिकेशन में इवेंट थ्रेड नहीं होता है, तो आप रनटाइम सिस्टम को सूचित करने के लिए setAcceptEvents (बूलियन) का आह्वान कर सकते हैं कि एप्लिकेशन अब ईवेंट स्वीकार नहीं करता है। उस एप्लिकेशन के लिए कतारबद्ध सभी घटनाओं को तब त्याग दिया जाता है।

एपीआई दस्तावेज: http://www.blackberry.com/developers/docs/4.3.0api/net/rim/device/api/system/Application.html#invokeLater(java.lang.Runnable)

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