2010-11-06 25 views
35

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

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

मुझे ध्यान रखना चाहिए कि मैंने प्रतीक्षा (यहां सम्मिलित संख्या) का उपयोग करने का प्रयास किया है; लेकिन मुझे ग्रहण से कहा गया है कि यह एक स्टैक अवरोध त्रुटि या कुछ प्रकार का कारण बनता है और अपवाद फेंकता है, इस प्रकार कुछ भी नहीं कर रहा है: (

अच्छा यह दिलचस्प है, (जिस तरह से मैंने चीजों को प्रोग्राम किया है "दिलचस्प" कम से कम कहने के लिए) मैंने थ्रेड स्लीप (5000) किया और कोशिश करने के लिए इसे फेंक दिया, यह 5 सेकंड तक सोता है और फिर कोड जारी रखता है। हालांकि, मेरे बटन अपडेट होने तक दिखाई नहीं देते हैं ।। यूआई धागा रोकने कभी नहीं:। (वास्तव में घटना संचालित प्रोग्रामिंग नफरत है)

उत्तर

93

घटनाओं के संदर्भ में सोचने के लिए सीखना वास्तव में कुंजी यहाँ आप इसे पहला नियम है क्या कर सकते हैं :)

है। यूआई थ्रेड आपके ऐप को उत्तरदायी महसूस करने के लिए ज़िम्मेदार है। आपके द्वारा किए गए किसी भी काम को ब्लॉक नहीं करना चाहिए; ऐसा करें जो आपको करने की ज़रूरत है और जितनी जल्दी हो सके लौटें। निश्चित रूप से UI थ्रेड पर I/O करने से बचें। (ऐसे कुछ स्थान हैं जहां आप जीवन चक्र की आवश्यकताओं के कारण वास्तव में इसकी सहायता नहीं कर सकते हैं, उदाहरण के लिए में ऐप स्थिति सहेजना।) यदि आप कभी भी यूआई थ्रेड पर Thread.sleep पर कॉल करते हैं तो आप इसे गलत कर रहे हैं।

एंड्रॉइड इसे "एप्लिकेशन प्रतिक्रिया नहीं दे रहा है" (या "एएनआर") त्रुटि के साथ लागू करता है जो उपयोगकर्ता देखता है। जब भी आप इसे एंड्रॉइड ऐप में देखते हैं तो इसका मतलब है कि डेवलपर ने ऐसा कुछ किया जिससे यूआई थ्रेड बहुत लंबे समय तक रुक गया। अगर डिवाइस वास्तव में किसी कारण से नीचे गिर गया है तो यह त्रुटि वास्तव में ऐप डेवलपर की गलती नहीं हो सकती है, लेकिन आमतौर पर इसका मतलब है कि ऐप कुछ गलत कर रहा है।

आप अपनी खुद की घटनाओं को पोस्ट करके इस मॉडल का उपयोग अपने लाभ में कर सकते हैं। यह आपको अपने ऐप को बताने का एक आसान तरीका देता है, "इसे बाद में करें।" एंड्रॉइड में अपनी खुद की घटनाओं को पोस्ट करने की कुंजी Handler कक्षा में है। विधि postDelayed आपको Runnable शेड्यूल करने देती है जिसे मिलीसेकंड की एक निश्चित संख्या के बाद निष्पादित किया जाएगा।

आप एक गतिविधि है कि कुछ इस तरह दिखता है:

public class MyActivity extends Activity { 
    private Handler mHandler = new Handler(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mHandler.postDelayed(new Runnable() { 
      public void run() { 
       doStuff(); 
      } 
     }, 5000); 
    } 

    private void doStuff() { 
     Toast.makeText(this, "Delayed Toast!", Toast.LENGTH_SHORT).show(); 
    } 
} 

फिर 5 सेकंड के बाद गतिविधि बनने के बाद आप doStuff में बनाया टोस्ट देखेंगे।

यदि आप कस्टम View लिख रहे हैं तो यह और भी आसान है। दृश्यों की अपनी postDelayed विधि है जो सबकुछ सही Handler पर पोस्ट की जाएगी और आपको अपना स्वयं का निर्माण करने की आवश्यकता नहीं है।

दूसरा नियम है: दृश्य केवल UI थ्रेड पर संशोधित किया जाना चाहिए। उन अपवादों को जिन्हें आप प्राप्त कर रहे हैं और अनदेखा कर रहे हैं, कुछ गलत हो गया है और यदि आप उन्हें अनदेखा करते हैं तो आपका ऐप शायद दिलचस्प तरीकों से गलत व्यवहार करना शुरू कर देगा। यदि आपका ऐप अन्य धागे में अपना अधिकांश काम करता है तो आप post ईवेंट सीधे उस दृश्य में देख सकते हैं जिसे आप संशोधित करना चाहते हैं ताकि संशोधन सही ढंग से चल सकें।

यदि आपके कोड के उस भाग से आपके Activity का संदर्भ है तो आप Activity#runOnUIThread का भी उपयोग कर सकते हैं, जो वास्तव में नाम का तात्पर्य है। यदि आप एक दृश्य को पोस्ट करना चाहते हैं तो आप इस दृष्टिकोण को पसंद कर सकते हैं, वास्तव में संदर्भ में समझ में नहीं आता है।

विचारों के अपडेट के रूप में जब तक आप कोई बटन नहीं दबाते, तब तक दिखाई नहीं देते हैं, ये किस तरह के विचार हैं? क्या वे कस्टम विचार हैं जो इन अद्यतनों को चित्रित कर रहे हैं? यदि हां, तो क्या आप रेड्रा को ट्रिगर करने के लिए डेटा परिवर्तन के बाद invalidate पर कॉल करना याद कर रहे हैं? दृश्य अमान्य होने के बाद ही खुद को फिर से खींचा जाता है।

+0

अच्छी तरह से मेरे तरीकों की त्रुटि यह है कि मैं लगातार एक अलग थ्रेड में विचारों को संशोधित करने की कोशिश कर रहा हूं जो लगातार चल रहा है ताकि यूआई लॉक न हो ... क्योंकि मुझे यकीन नहीं है कि कैसे पास किया जाए मेरे चल रहे थ्रेड द्वारा उत्पन्न मान ... यूआई को। हालांकि अविश्वसनीय रूप से उपयोगी प्रतिक्रिया, और मैं इसके लिए बहुत धन्यवाद –

+0

एक AsyncTask का उपयोग करें – Falmarri

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