2013-08-15 5 views
10

मैं एंड्रॉइड प्रोग्रामिंग के लिए बहुत नया हूं इसलिए कृपया मेरी नोबई-नेस को क्षमा करें। मैं एक बहुत ही सरल गतिविधि बनाने की कोशिश कर रहा हूं जिसमें लेआउट के बीच में एक टेक्स्ट व्यू होगा और बस इसे हर दो सेकंड में एक अलग पाठ पर स्विच करें। उदाहरण के लिए, टेक्स्ट व्यू "टेक्स्ट 1" कहेंगे, कुछ सेकंड के लिए रुकें, फिर "टेक्स्ट 2, और फिर से रोकें। आखिरकार, मैं और ग्रंथ जोड़ना चाहता हूं और उन्हें एक दूसरे के बाद एक चक्र रखना चाहता हूं। मुझे पता है कि यह एक जैसा लगता है सुपर सरल बात है, लेकिन मैं मुख्य रूप से इस पल में धागे और हैंडलरों के बारे में जानने की कोशिश कर रहा हूं। वैसे भी, मैंने पढ़ा है कि हमें त्रुटि को रोकने के लिए यूआई थ्रेड से लंबी चीजें कैसे रखनी चाहिए, इसलिए मैंने सोचा कि मैं एक हैंडलर का उपयोग करूंगा । केवल स्क्रीन पर 2 ग्रंथों के बीच स्विच करने दुर्भाग्य से, मैं नहीं इस काम करने के लिए प्राप्त कर सकते हैं यहाँ कुछ कोड है:।हैंडलर और पोस्ट के साथ रुकने एंड्रॉइड में पोस्ट किया गया

public class MainActivity extends Activity { 

String[] myarray = {"text1" , "text2"}; 
int arraylength = myarray.length; 
int count; 
Handler handler = new Handler(); 

TextView mytexts; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mytexts = (TextView)findViewById(R.id.my_texts); 
    mytexts.setText(myarray[0]); 

    Thread t = new Thread(new Runnable(){ 
     public void run() { 
      for (int count = 0; count < arraylength; count++){ 
       handler.postDelayed(new Runnable(){ 
        public void run() { 
         mytexts.setText(myarray[1]); 
        }     
       }, 7000); 
      } 
     } 
    }); 
    t.start(); 
    } 
} 

मैं क्या logcat में देख सकते हैं से, हैंडलर postDelayed एक के बाद एक सही चलाने के लिए लगता है (मेरे कोड के मामले में, यह पोस्ट के साथ 7 सेकेंड का इंतजार नहीं करता है, किसी अन्य पोस्ट को करने के लिए)। इसके अलावा, मैं "mytexts.setText (myar" में 1 बनाना चाहता हूं रे [1]); "लूप के लिए" गिनती "जैसा ही हो, इसलिए यह सरणी में तारों में से एक जैसा ही हो सकता है लेकिन इससे मुझे कोई त्रुटि मिलती है। मैं इस पर घंटों तक फंस गया हूं और अन्य उदाहरण जो मैंने पाया है, मेरे जैसे किसी के लिए बहुत जटिल है जो मुख्य रूप से मूल बातें प्राप्त करना चाहता है इससे पहले कि मैं अन्य चीजों से निपट सकूं। इनमें से किसी भी मदद से किसी भी मदद की सराहना की जाएगी। धन्यवाद।

+0

आप 'postDelayed' क्यों न निकालने और एक' while' के साथ एक 'post' का उपयोग और फिर कुछ' थ्रेड कर (समय गुणक में देरी करने पर ध्यान दें) .sleep (समय) '? –

+0

@ रोटरी पोस्ट पोस्ट करें देरी विधि देरी के बाद मुख्य धागे पर निष्पादित करने के लिए कोड पोस्ट करेगा। आपको धागे को सोने की जरूरत नहीं है। इस विशेष मामले में उसे थ्रेड की जरूरत नहीं है! – Ali

+0

@ एली हाँ आप सही हैं, मैं अपना कोड बदलना नहीं चाहता था, लेकिन उसे यह बताने के लिए कि उस कोड के साथ इसे कैसे किया जाए। –

उत्तर

19

postDelayed गैर अवरोधन है, जिसका अर्थ है कि यह इसे बाद में ऐसा करने के लिए कतार में जोड़ देगा। तो आप जो देख रहे हैं वह सभी पाठ अपडेट 7 वें सेकंड में एक साथ हो रहा है। मैं यह इसलिए कहता हूं क्योंकि onCreate विधि से आप postDelay आईएनजी हैं, वास्तव में जब आप शायद इसे onResume या onPostResume से करना चाहते हैं।

पोस्ट कतार में रननेबल जोड़ने के लिए धागा बनाने का कोई कारण नहीं है। आपका कोड अधिक इस तरह दिखना चाहिए:

@Override 
protected void onResume() { 
    super.onResume(); 
    for (int count = 0; count < arraylength; count++){ 
     handler.postDelayed(new Runnable(){ 
      @Override 
      public void run() { 
       mytexts.setText(myarray[count]); 
      } 
     }, 7000 * (count + 1)); 
    } 
} 
+0

हां, सभी पाठ अपडेट 7 वें सेकंड में हो रहे हैं। मैं थोड़ा अस्पष्ट हूं कि मुझे एक नया धागा बनाने की ज़रूरत क्यों नहीं है। क्या PostDelayed पृष्ठभूमि थ्रेड में स्वचालित रूप से 7-सेकंड प्रतीक्षा करता है? मुझे पता है कि यह इंतजार यूआई पर एक त्रुटि का कारण बनता है, इसलिए मैंने मूल रूप से सोचा कि मुझे एक नया धागा चाहिए। –

+0

आपको यह मिल गया है, यह वर्तमान (UI) थ्रेड के बाहर "प्रतीक्षा" करेगा। – JRomero

+0

बहुत बढ़िया। यह सामान साफ ​​करता है। बहुत बहुत धन्यवाद। –

2

ऐसा इसलिए है क्योंकि आपका लूप एक दूसरे के बाद 7 सेकंड के बाद 7 सेकेंड के बाद चलाने के लिए आपके सभी हैंडलर सेट कर रहा है लेकिन अब से 7 सेकंड के बाद। आप या तो postDelayed विधि में जोड़ सकते हैं या हैंडलर में postAtTime विधि का उपयोग कर सकते हैं।

इसके अलावा, आपको इसे थ्रेड में करने की आवश्यकता नहीं है, आप इसे पूरी तरह से छुटकारा पा सकते हैं।

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