studio proyectos programacion para guia desarrollo avanzado aplicaciones android timer timertask

proyectos - Android: Accediendo al elemento UI desde el hilo del temporizador



manual programacion android (3)

No es necesario llamar a runOnUIThread dentro del controlador. Al llamar a post en la instancia de Handler, el ejecutable que pase se ejecutará en el subproceso de la interfaz de usuario en algún momento en el futuro. Cambie su código para verse así 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); } });

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 acceder a un grupo de botones de radio en la interfaz de usuario y configurarlo como revisado a intervalos regulares, pero sigo teniendo diferentes errores, me di cuenta de que debo usar un controlador, pero aún no funciona ... ¿alguien puede decirme dónde? Me estoy yendo mal ... soy un novato y estoy probando cosas para entender cómo funciona mejor ... por favor ayuda ...


Puede pasar la Actividad como un parámetro al método que ejecuta el timertask, y luego puede usar Activity.runOnUiThread para ejecutar sus tareas en UI Thread. Hay muchas publicaciones en el sitio de relacionadas con el uso del uso de runOnUiThread.


onCreate crear el Handler en el subproceso de la interfaz de usuario, es decir, en onCreate de su Activity .

Como lo crea en el método de run de un subproceso en segundo plano, el controlador ejecutará su código en ese mismo subproceso en segundo plano.

También puedes inicializar tu Handler directamente:

public class MyActivity extends Activity{ private Handler handler = new Handler(); //more code }

Y luego no uses 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); } });

EDITAR: Ok, intente este código limpiado. Debido a que no publicó su Actividad completa, esto no funcionará de manera inmediata:

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