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