2012-03-16 20 views
17
public Button stb; 
static int cnt=0; 
public ArrayList<RadioButton> Butgrp1 = new ArrayList<RadioButton>(); 
Timer myt; 
TimerTask t; 
stb.setOnClickListener(new OnClickListener() { 

public void onClick(View v) { 

myt.mschedule(new TimerTask() { 

    @Override 
    public void run() { 

     // TODO Auto-generated method stub 


     System.out.println("Entering run"); 
     Handler h=new Handler(); 

     h.post(new Runnable() { 

      public void run() { 

       // TODO Auto-generated method stub 
       runOnUiThread(new Runnable() { 

        public void run() { 
         // TODO Auto-generated method stub 
         Butgrp1.get(cnt).setChecked(true); 
         cnt=cnt+1; 
         if(cnt>4) 
          cnt=0; 
         if(cnt>0) 
         // Butgrp1.get(cnt-1).setChecked(false); 
         System.out.println(cnt); 
        } 
       }); 


      } 
     }); 

     //rg.getChildAt(cnt).setPressed(true); 

    } 
},1000,2000); 

मैं ui पर रेडियो बटन के एक समूह का उपयोग और इसे सेट नियमित अंतराल पर जाँच के रूप में की जरूरत है, लेकिन मैं विभिन्न त्रुटियों हो रही, मैं महसूस किया मैं एक हैंडलर का उपयोग करना चाहिए रखने के लिए, लेकिन इसकी अभी भी काम नहीं कर सकते हैं ... किसी को भी कृपया मुझे बताओ मैं कहाँ गलत जा रहा हूँ .... एक नौसिखिया हूँ और समझने के लिए बेहतर काम कर रहा है ... कृपया मदद ...एंड्रॉयड: प्रवेश यूआई तत्व टाइमर धागे से

+0

क्या आप कुछ त्रुटियां पोस्ट कर सकते हैं जिन्हें आप देख रहे हैं? –

उत्तर

20

आप अपने Activity की onCreate में, यूआई थ्रेड में Handler बनाने के लिए अर्थात।

क्योंकि आप एक पृष्ठभूमि धागे की run विधि में इसे बनाने, हैंडलर है कि बहुत ही पृष्ठभूमि धागा में अपने कोड निष्पादित करेंगे।

तुम भी प्रारंभ कर सकता है आपके Handler सीधे:

public class MyActivity extends Activity{ 

    private Handler handler = new Handler(); 

    //more code 
} 

और फिर runOnUIThread का उपयोग नहीं करते:

handler.post(new Runnable() { 
      public void run() { 
        // TODO Auto-generated method stub 
        Butgrp1.get(cnt).setChecked(true); 
        cnt=cnt+1; 
        if(cnt>4) 
         cnt=0; 
        if(cnt>0) 
        // Butgrp1.get(cnt-1).setChecked(false); 
        System.out.println(cnt); 
       } 
      }); 

संपादित करें: ठीक है यह साफ कोड का प्रयास करें। क्योंकि आप अपना पूरा गतिविधि पोस्ट नहीं इस बॉक्स से बाहर काम करेंगे नहीं:

public class TestActivity extends Activity { 

    private Button button; 
    static int cnt=0; 
    public ArrayList<RadioButton> buttonArray = new ArrayList<RadioButton>(); 
    private Timer timer = new Timer(); 

    protected void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 

     button.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       timer.schedule(new MyTimerTask(), 1000,2000); 
      } 
     }); 
    } 


    private void doButtonStuff(){ 
     buttonArray.get(cnt).setChecked(true); 
     cnt=cnt+1; 
     if(cnt>4){ 
      cnt=0; 
     } 
     if(cnt>0){ 
      // Butgrp1.get(cnt-1).setChecked(false); 
      System.out.println(cnt); 
     } 
    } 

    private class MyTimerTask extends TimerTask{ 

     @Override 
     public void run() {   
      runOnUiThread(new Runnable() {    
       @Override 
       public void run() { 
        doButtonStuff(); 
       } 
      }); 
     }  
    } 
} 
+0

देने के लिए धन्यवाद देता है, मैंने जो किया है, वह मैंने किया है जो इसे लूप में प्रवेश करता है, लेकिन एक बार बटन पर पहुंचने पर यह निम्न त्रुटि घातक अपवाद-टाइमर 0 ई/AndroidRuntime दे समाप्त हो जाता है (407): android.view.ViewRoot $ CalledFromWrongThreadException: केवल मूल बात यह है कि एक दृश्य पदानुक्रम बनाया अपने विचार छू सकता है। – Ajay

+1

@Ajay आपको यह सुनिश्चित करने की ज़रूरत है कि आप यूआई थ्रेड से अपना हैंडलर बनाएं तो आप अच्छे हैं – wnafee

+0

@wnafee मैंने इसे ui थ्रेड से बनाया है, फिर भी मैं त्रुटि को दबाता हूं, मुझे लगता है कि मैं इसे लागू नहीं कर रहा हूं टाइमर कार्य सही ढंग से – Ajay

0

आप डॉन 'सामान बाहर कोशिश कर रहा हूँ हैंडलर के अंदर runOnUIThread को कॉल करने की आवश्यकता नहीं है। हैंडलर इंस्टेंस पर पोस्ट को कॉल करके, आपके द्वारा पारित रनने योग्य भविष्य में किसी बिंदु पर यूआई थ्रेड पर निष्पादित किया जाएगा। इस तरह देखने के लिए अपने कोड को बदलें और यह काम करना चाहिए:

Handler h=new Handler(); 

    h.post(new Runnable() { 

     public void run() { 

        // TODO Auto-generated method stub 
        Butgrp1.get(cnt).setChecked(true); 
        cnt=cnt+1; 
        if(cnt>4) 
         cnt=0; 
        if(cnt>0) 
        // Butgrp1.get(cnt-1).setChecked(false); 
        System.out.println(cnt); 
       } 
      }); 
+0

उत्तर देने के लिए धन्यवाद, मैंने जो किया है वह करने के लिए मैंने लूप में प्रवेश करने के लिए कहा था, लेकिन बटन को एक्सेस करने के बाद यह निम्नलिखित त्रुटि – Ajay

0

आप विधि है कि timertask चलाता है के लिए एक पैरामीटर के रूप में गतिविधि पारित कर सकते हैं, और फिर आप के लिए Activity.runOnUiThread उपयोग कर सकते हैं यूआई थ्रेड में अपने कार्यों को निष्पादित करें। RunOnUiTread उपयोग के उपयोग के संबंध में स्टैक ओवरफ्लो साइट में बहुत सी पोस्ट हैं।

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