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

muszę dostęp do grupy przycisków opcji w interfejsie użytkownika i ustawić go jako sprawdzane w regularnych odstępach czasu, ale wciąż otrzymuję różne błędy, zdałem sobie sprawę, że musi korzystać z obsługi, ale nadal nie działa ... Czy ktoś może mi powiedzieć, gdzie idę źle ... Jestem nowicjuszem i wypróbowuję rzeczy, aby zrozumieć, że działa lepiej ... proszę pomóż ...Android: Dostęp UI Element z gwintem timera

+0

Czy możesz opublikować niektóre błędy, które widzisz? –

Odpowiedz

20

Musisz utworzyć Handler w wątku UI, czyli w onCreate swojej Activity.

Ponieważ utworzysz go w metodzie run wątku tła, program obsługi wykona kod w tym samym wątku tła.

Można również zainicjować Handler bezpośrednio:

public class MyActivity extends Activity{ 

    private Handler handler = new Handler(); 

    //more code 
} 

A potem nie używać 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); 
       } 
      }); 

EDIT: Ok spróbuj tego kodu czyszczone. Ponieważ nie pisać swoją pełną aktywność to nie będzie działać po wyjęciu z pudełka:

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

Dzięki za odpowiedź, zrobiłem to, o co mnie poprosiłeś, wchodzi w pętlę, ale raz dostęp do przycisku kończy się, powodując następujący błąd: Fatal Exception-Timer 0/ E/AndroidRuntime (407): android.view.ViewRoot $ CalledFromWrongThreadException: Tylko oryginalny wątek, który utworzył hierarchię widoku, może dotknąć jej widoków. – Ajay

+1

@Ajay Musisz upewnić się, że twoja obsługa z wątku UI to jesteś dobry – wnafee

+0

@wnafee Stworzyłem go z wątku interfejsu użytkownika, wciąż mam błąd, mam wrażenie, że nie implementuję zadanie timera poprawnie – Ajay

0

Ty nie t potrzebujesz wywołać runOnUIThread wewnątrz handler'a. Przez wywołanie postu na instancji Handler'a, możliwe do uruchomienia przejście zostanie wykonane w wątku UI w pewnym momencie w przyszłości. Zmień swój kod wyglądać tak i to powinno działać:

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

Dziękuję za odpowiedź, zrobiłem to, o co mnie prosiłeś, aby wszedł w pętlę, ale gdy przycisk jest dostępny, kończy się, dając następujący błąd – Ajay

0

można przekazać działalność jako parametr do metody, która uruchamia TimerTask, a następnie można użyć do Activity.runOnUiThread wykonywać swoje zadania w wątku UI. Istnieje wiele postów na stronie stackoverflow dotyczących użycia runOnUiThread.