2012-03-16 17 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); 

Ben ui üzerindeki radyo düğmelerinin bir grup erişebilir ve düzenli aralıklarla kontrol olarak ayarlamak gerekir, ancak ben, ben bir işleyici kullanmalıdır gerçekleştirilen farklı hataları almaya devam ama hala çalışmıyor ... herkes bana nerede yanlış gidiyorum söyler misiniz .... bir acemi am ve daha iyi çalışmayı anlamak için şeyler deniyorum ... lütfen yardım edin ...Android: Erişim UI Öğe zamanlayıcı iplikten

+0

Gördüğünüz hatalardan bazılarını gönderebilir misiniz? –

cevap

20

Sen Activity arasında onCreate yılında yani UI Thread içinde Handler oluşturmak zorundayız.

Bir arka plan iş parçacığının run yönteminde oluşturduğunuz için, işleyici kodunuzu aynı arka plan iş parçacığında yürütür.

Ayrıca, bir doğrudan Handler ilklendireceğiniz:

public class MyActivity extends Activity{ 

    private Handler handler = new Handler(); 

    //more code 
} 

Sonra runOnUIThread kullanmayın:

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); 
       } 
      }); 

DÜZENLEME: Tamam bu temizledik kodu deneyin.

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

Yanıtladığınız için yaptım, yaptıklarımı yapmamı istedim. düğmesine erişilirse, aşağıdaki hatayı veren sonlandırma Önemli Özel Durum Zamanlayıcısı 0 E/AndroidRuntime (407): android.view.ViewRoot $ CalledFromWrongThreadException: Yalnızca bir görünüm hiyerarşisi oluşturan orijinal iş parçacığı kendi görünümlerine dokunabilir. – Ajay

+1

@Ajay İşleyicinizi UI iş parçacığından oluşturduğunuzdan emin olmanız gerekiyor. İyi durumdasınız – wnafee

+0

@wnafee Ui dizisinden oluşturdum, hala hatayı alıyorum, uygulamama dair bir his var. zamanlayıcı görevi doğru – Ajay

0

İşleyicinin içinde runOnUIThread'i aramalı. Handler örneğindeki gönderiyi çağırarak, geçtiğiniz runnable UI iş parçacığı üzerinde gelecekte bir noktada yürütülür. Bu gibi görünmek için kodunuzu değiştirin ve çalışması gerekir:

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

Yanıtladığınız için yaptığınız şey, döngüye girmesini istediğimi yaptım, ancak düğmeye erişildikten sonra şu hata iletisini sonlandırıyor – Ajay

0

Sen timertask çalışan yönteme parametre olarak Etkinliği geçebilir ve sonra için Activity.runOnUiThread kullanabilirsiniz: Eğer tam Aktivite sonrası yoktu Çünkü bu kutunun dışında çalışmaz görevlerinizi UI Thread'de yürütün. RunOnUiThread kullanımı ile ilgili olarak stackoverflow sitesinde çok sayıda gönderi var.