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

necesito para acceder a un grupo de botones de opción en la interfaz de usuario y configurarlo como controlarse a intervalos regulares, pero me siguen dando diferentes errores, me di cuenta que debe utilizar un manipulador, pero todavía no está funcionando ... ¿alguien puede decirme por favor dónde estoy yendo mal ... soy un novato y estoy probando cosas para entender el funcionamiento mejor ... por favor ayuda ...Android: Acceso a la interfaz de usuario del elemento de hilo temporizador

+0

¿Podría publicar algunos de los errores que está viendo? –

Respuesta

20

Tienes que crear el Handler en el hilo de interfaz de usuario, es decir, en onCreate de su Activity.

Como lo crea en el método run de una cadena de fondo, el controlador ejecutará su código en la misma cadena de fondo.

También puede inicializar su Handler directamente:

public class MyActivity extends Activity{ 

    private Handler handler = new Handler(); 

    //more code 
} 

Y luego no utilizan 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 tratar este código limpiado. Debido a que no fija su plena actividad, esto no funcionará fuera de la caja:

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

Gracias por responder, hice lo que me pidió que lo haga, pero una vez se accede al botón, termina dando el siguiente error Fatal Exception-Timer 0 E/AndroidRuntime (407): android.view.ViewRoot $ CalledFromWrongThreadException: Solo el subproceso original que creó una jerarquía de vista puede tocar sus vistas. – Ajay

+1

@Ajay Debes asegurarte de que creas tu controlador desde el hilo de la interfaz de usuario, entonces eres bueno – wnafee

+0

@wnafee Lo creé desde el hilo de la interfaz de usuario, aún tengo el error, tengo la sensación de que no estoy implementando el tarea del temporizador correctamente – Ajay

0

You don ' Necesito llamar a runOnUIThread dentro del controlador. Al llamar a la publicación en la instancia de controlador, el ejecutable que pase se ejecutará en el hilo de la interfaz de usuario en algún momento en el futuro. Cambiar el código para tener este aspecto y debería funcionar:

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

Gracias por responder, hice lo que me pidió que haga, ingresa al ciclo, pero una vez que se accede al botón, termina dando el siguiente error – Ajay

0

se puede pasar a la actividad como un parámetro para el método que ejecuta el TimerTask, y luego se puede utilizar para Activity.runOnUiThread ejecuta tus tareas en UI Thread. Hay muchas publicaciones en el sitio stackoverflow sobre el uso del uso de runOnUiThread.

Cuestiones relacionadas