2015-06-06 9 views
5

मुझे लूप के भीतर विधि assign_backgrounds() विधि में देरी करने में परेशानी हो रही है। मैं बनाने का प्रयास कर रहा हूं साइमन कहता है गेम, लेकिन "साइमन" दबाए जाने वाले अगले बटन को देरी और दिखाए जाने के बजाय, यह सभी बटन पर दिखाता है। यहां जो भी मदद करेंगे उसकी बहुत सराहना की जाएगी। धन्यवाद।जावा में लूप के लिए विधि में देरी कैसे करूँ?

boolean simonsTurn = true; 
int x = 4; 
int s; 
int delay = 1000; 
int array_values[] = new int[]{1,2,3,4}; 


public void simonSays() { 
    // running = true; 
    if (simonsTurn == true) { 
     go(); 

     for (int i = 0; i < x; i++) { 
      Handler handler = new Handler(); 
      handler.postDelayed(new Runnable() { 
       public void run() { 
        go(); 
       } 
      }, 1000); 
     }    
    } 
} 

public void go(){ 
    s = random_int_between(0,3); 
     assign_backgrounds(array_values[s]); 
} 

public void assign_backgrounds(int array_values){ 

    Handler handler = new Handler(); 

    if(array_values == 1){ 
     button1_.invalidate(); 
     button1_.setBackgroundResource(R.drawable.goatclicked); 
     button1_.refreshDrawableState(); 

     handler.postDelayed(new Runnable(){ 
     public void run(){ 
     button1_.invalidate(); 
     button1_.setBackgroundResource(R.drawable.goat); 
     button1_.refreshDrawableState();}}, 1000); 
     } 
    else if(array_values == 2){ 
     button2_.invalidate(); 
     button2_.setBackgroundResource(R.drawable.pigclicked); 
     button2_.refreshDrawableState(); 

     handler.postDelayed(new Runnable(){ 
      public void run(){ 
       button2_.invalidate(); 
       button2_.setBackgroundResource(R.drawable.pig); 
       button2_.refreshDrawableState();}}, 1000); 
    } 
    else if(array_values == 3){ 
     button3_.invalidate(); 
     button3_.setBackgroundResource(R.drawable.chickenclicked); 
     button3_.refreshDrawableState(); 

     handler.postDelayed(new Runnable() { 
      public void run() { 
       button3_.invalidate(); 
       button3_.setBackgroundResource(R.drawable.chicken); 
       button3_.refreshDrawableState();}}, 1000); 
    } 
    if(array_values == 4) { 
     button4_.invalidate(); 
     button4_.setBackgroundResource(R.drawable.cowclicked); 
     button4_.refreshDrawableState(); 

     handler.postDelayed(new Runnable(){ 
      public void run(){ 
       button4_.invalidate(); 
       button4_.setBackgroundResource(R.drawable.cow); 
       button4_.refreshDrawableState();}}, 1000); 
    } 
} 

उत्तर

1

ऐसा इसलिए है क्योंकि आप हैंडलर बहुत तेज़ बना रहे हैं और फिर वे सभी एक ही समय में शुरू हो रहे हैं। आपको हैंडलर के काम और असिंक्रोनस/पृष्ठभूमि कार्यों के बारे में देखना चाहिए।

अब अपनी समस्या पर वापस जाएं, आप एक लूप को बुला रहे हैं और यह एक पंक्ति में हैंडलर बना रहा है और उन्हें बहुत तेजी से बनाया जा रहा है (नैनोसेकंड)। तब वे आपके postDelayed() कॉल के कारण उस निर्माण समय से 1 सेकंड लॉन्च करेंगे। यही कारण है कि सब कुछ एक ही समय में popping है! इन सभी देरी पदों को समवर्ती पृष्ठभूमि धागे पर लगभग एक ही समय में निष्पादित किया जा रहा है।

for(int i,...) लूप के बजाय आप वैश्विक int i चाहते हैं, बस इसे फ़ाइल के शीर्ष पर जोड़ें।

साइमन की बारी में से किसी के अंत में आप assign_background अंदर if, else if बयान के अंदर, चाहता हूँ (Runnables के अंत में है, तो आप go() कॉल करने के लिए चाहता हूँ।

इसका कारण यह है समस्याओं का कारण बन सकता है आप इन सभी पृष्ठभूमि धागे से मुख्य थ्रेड का उपयोग करने की कोशिश कर रहे हैं। इसलिए आप एक त्वरित हैक के रूप में कार्य runOnMainUIThread() कॉल करने के लिए जब आप go फ़ंक्शन को कॉल हो सकता है।

कुल मिलाकर, आप जब तक कुछ समस्याएं हैं जा रहे हैं आप हैंडलर, पृष्ठभूमि प्रक्रियाओं और धागे को समझते हैं। एंड्रॉइड के बारे में जानने के लिए निश्चित रूप से महान ज्ञान आईडी पर केवल एफवाईआई पर ठोस दस्तावेज है।

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