Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android


 
Herramientas
  #1  
Viejo 08/01/16, 03:14:29
Avatar de 4ris
4ris 4ris no está en línea
Miembro del foro
Mensajes: 80
Compra y venta: (1)
 
Fecha de registro: jun 2011
Mensajes: 80
Modelo de smartphone: Motorola defy
Tu operador: Movistar
Mencionado: 1 comentarios
Tagged: 0 hilos
Texto con delay

Buenas, me surge una pregunta que no he conseguido solucionar. Quiero cambiar un texto varias veces con algo de delay, en vez de una imagen de carga o algo similar.

Por ejemplo, cuando tu pulses un botón diga algo como:

Calculando.

se actualiza por

Calculando...

Se actualiza por

"resultado"

La cosa es que he intentado crear hilos y demás pero siempre me pone el último solo. Se os ocurre algún modo?

Un saludo
Responder Con Cita


  #2  
Viejo 09/01/16, 00:15:21
Avatar de beta tester
beta tester beta tester no está en línea
Miembro del foro
Mensajes: 166
 
Fecha de registro: mar 2015
Mensajes: 166
Modelo de smartphone: OnePlus 5
Mencionado: 3 comentarios
Tagged: 1 hilos
Se podría hacer con un Handler. Puedes fijar el tiempo para que se ejecute el hilo que haga el cambio del texto; y del mismo modo para el segundo cambio.
Responder Con Cita
  #3  
Viejo 09/01/16, 03:17:59
Avatar de 4ris
4ris 4ris no está en línea
Miembro del foro
Mensajes: 80
Compra y venta: (1)
 
Fecha de registro: jun 2011
Mensajes: 80
Modelo de smartphone: Motorola defy
Tu operador: Movistar
Mencionado: 1 comentarios
Tagged: 0 hilos
Cita:
Originalmente Escrito por beta tester Ver Mensaje
Se podría hacer con un Handler. Puedes fijar el tiempo para que se ejecute el hilo que haga el cambio del texto; y del mismo modo para el segundo cambio.
Claro, es lo que hago pero no me funciona.

El código es el siguiente:

Código:
public void responde() {

       // if (respuestasPersonalizas = false) {



            if (sino == 1) {
                respuesta.setText(R.string.yes);

            } else if (sino == 2) {
                respuesta.setText(R.string.no);
            } else {
                respuesta.setText(R.string.dontknow);
            }

            sino = 0;
        }
    //}




    public void pensar(View v){
        respuesta.setText("Ummmm");
        new Handler().postDelayed(new Runnable() {
            @override
            public void run() {
                runOnUiThread(new Runnable() {
                    @override
                    public void run() {
                        responde();
                    }
                });
            }

        }, 1000);

    }
Un saludo
Responder Con Cita
  #4  
Viejo 11/01/16, 13:36:48
Avatar de 4ris
4ris 4ris no está en línea
Miembro del foro
Mensajes: 80
Compra y venta: (1)
 
Fecha de registro: jun 2011
Mensajes: 80
Modelo de smartphone: Motorola defy
Tu operador: Movistar
Mencionado: 1 comentarios
Tagged: 0 hilos
upp
Responder Con Cita
  #5  
Viejo 12/01/16, 16:26:06
Avatar de mocelet
mocelet mocelet no está en línea
Desarrollador
Mensajes: 2,203
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -
Mencionado: 17 comentarios
Tagged: 2 hilos
Probablemente estás bloqueando el hilo principal, ¿al método pensar() dónde lo llamas? ¿Llamas a algo justo después que requiera mucho tiempo y no devuelva el control a Android? Si a Android no le devuelves el control no puede pintar el nuevo texto de la etiqueta por muchos setText que llames.

Si de verdad hay algo que tiene que pensar y lleva su tiempo, eso debería estar en una AsyncTask o en un hilo, y actualizar las etiquetas bien con el progress update de las asynctask o con un handler como haces.

P.D: Sobre el Runnable que has puesto, aunque funciona no tiene sentido meter dentro el runOnUiThread pues el Handler ya se ejecuta en el UI Thread o hilo principal. Vamos, que esto es lo mismo y es menos lioso:
Código:
 
        new Handler().postDelayed(new Runnable() {
            @override
            public void run() {
                        responde();
            }
        }, 1000);
Responder Con Cita
  #6  
Viejo 12/01/16, 17:18:50
Avatar de 4ris
4ris 4ris no está en línea
Miembro del foro
Mensajes: 80
Compra y venta: (1)
 
Fecha de registro: jun 2011
Mensajes: 80
Modelo de smartphone: Motorola defy
Tu operador: Movistar
Mencionado: 1 comentarios
Tagged: 0 hilos
Cita:
Originalmente Escrito por mocelet Ver Mensaje
Probablemente estás bloqueando el hilo principal, ¿al método pensar() dónde lo llamas? ¿Llamas a algo justo después que requiera mucho tiempo y no devuelva el control a Android? Si a Android no le devuelves el control no puede pintar el nuevo texto de la etiqueta por muchos setText que llames.

Si de verdad hay algo que tiene que pensar y lleva su tiempo, eso debería estar en una AsyncTask o en un hilo, y actualizar las etiquetas bien con el progress update de las asynctask o con un handler como haces.

P.D: Sobre el Runnable que has puesto, aunque funciona no tiene sentido meter dentro el runOnUiThread pues el Handler ya se ejecuta en el UI Thread o hilo principal. Vamos, que esto es lo mismo y es menos lioso:
Código:
 
        new Handler().postDelayed(new Runnable() {
            @override
            public void run() {
                        responde();
            }
        }, 1000);
Gracias compi lo probaré. El método pensar solo cambia un textview dependiendo el valor del contador. Por lo que no debería tardar nada
Responder Con Cita
  #7  
Viejo 12/01/16, 18:37:15
Avatar de mocelet
mocelet mocelet no está en línea
Desarrollador
Mensajes: 2,203
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -
Mencionado: 17 comentarios
Tagged: 2 hilos
La pregunta no era qué hace el método pensar, sino si después hacías algo que pudiera bloquear el hilo de ejecución. ¿Dónde cambias el valor del contador que dices?

Otra cosa que puedes probar es poner respuesta.invalidate() después del setText(...). A veces Android no se da por aludido de que tiene que refrescar el texto.

Última edición por mocelet Día 12/01/16 a las 19:40:05
Responder Con Cita
  #8  
Viejo 12/01/16, 20:29:44
Avatar de 4ris
4ris 4ris no está en línea
Miembro del foro
Mensajes: 80
Compra y venta: (1)
 
Fecha de registro: jun 2011
Mensajes: 80
Modelo de smartphone: Motorola defy
Tu operador: Movistar
Mencionado: 1 comentarios
Tagged: 0 hilos
Cita:
Originalmente Escrito por mocelet Ver Mensaje
La pregunta no era qué hace el método pensar, sino si después hacías algo que pudiera bloquear el hilo de ejecución. ¿Dónde cambias el valor del contador que dices?

Otra cosa que puedes probar es poner respuesta.invalidate() después del setText(...). A veces Android no se da por aludido de que tiene que refrescar el texto.
Después del pensar no hace nada, ahí acaba la app. El valor cambia dependiendo si se pulsa el botón subir volumen o bajar volumen.

Un saludo
Responder Con Cita
  #9  
Viejo 13/01/16, 10:43:08
Avatar de 4ris
4ris 4ris no está en línea
Miembro del foro
Mensajes: 80
Compra y venta: (1)
 
Fecha de registro: jun 2011
Mensajes: 80
Modelo de smartphone: Motorola defy
Tu operador: Movistar
Mencionado: 1 comentarios
Tagged: 0 hilos
Cita:
Originalmente Escrito por mocelet Ver Mensaje
La pregunta no era qué hace el método pensar, sino si después hacías algo que pudiera bloquear el hilo de ejecución. ¿Dónde cambias el valor del contador que dices?

Otra cosa que puedes probar es poner respuesta.invalidate() después del setText(...). A veces Android no se da por aludido de que tiene que refrescar el texto.
Increíble, cambié en handler y funciona perfectamente. Muchísimas gracias!
Responder Con Cita
Respuesta

Estás aquí
Regresar   HTCMania > Todo sobre Android > Programación y Desarrollo para Android

Herramientas

Reglas de Mensajes
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Las caritas están On
Código [IMG] está On
Código HTML está Off

Saltar a Foro



Hora actual: 19:51:56 (GMT +2)

Cookies settings
Powered by vBulletin™
Copyright © vBulletin Solutions, Inc. All rights reserved.
 
HTCMania: líderes desde el 2007