Actualizar vista en tiempo de ejecución en Android

El ejemplo es bastante sencillo: quiero informar al usuario sobre lo que la aplicación está haciendo simplemente mostrando un texto (canvas.drawText ()). Entonces, aparece mi primer mensaje, pero no los otros. Quiero decir, tengo un "setText" método, pero no se actualiza.

onCreate(Bundle bundle) { super.onCreate(bundle); setContentView(splash); // splash is the view class loadResources(); splash.setText("this"); boundWebService(); splash.setText("that"): etc(); splash.setText("so on"); } 

El dibujo de texto de la vista funciona haciendo sólo un drawText en onDraw () ;, por lo que setText cambia el texto pero no lo muestra.

Alguien me recomendó reemplazar la vista con un SurfaceView, pero sería un montón de problemas para sólo un par de actualizaciones, así que … ¿cómo diablos puedo actualizar dinámicamente la vista en tiempo de ejecución?

Debe ser bastante simple, sólo mostrando un texto para decir 2 segundos y luego el hilo principal haciendo sus cosas y luego actualizar el texto …

¡Gracias!

Actualizar:

He intentado implementar handler.onPost (), pero es la misma historia de nuevo. Déjeme ponerle el código:

 public class ThreadViewTestActivity extends Activity { Thread t; Splash splash; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); splash = new Splash(this); t = new Thread(splash); t.start(); splash.setTextow("OA"); try { Thread.sleep(4000); } catch (InterruptedException e) { } splash.setTextow("LALA"); } } 

Y:

 public class Splash implements Runnable { Activity activity; final Handler myHandler = new Handler(); public Splash(Activity activity) { this.activity=activity; } @Override public void run() { // TODO Auto-generated method stub } public synchronized void setTextow(final String textow) { // Wrap DownloadTask into another Runnable to track the statistics myHandler.post(new Runnable() { @Override public void run() { TextView t = (TextView)activity.findViewById(R.id.testo); t.setText(textow); t.invalidate(); } }); } } 

Aunque splash está en otro hilo, pongo un sueño en el hilo principal, uso el manejador para gestionar la interfaz de usuario y todo, no cambia nada, sólo muestra la última actualización.

No he golpeado esto todavía, pero creo que el patrón habitual es hacer la inicialización larga en un hilo de fondo, y utilizar Handler.post() para actualizar la interfaz de usuario. Vea http://developer.android.com/reference/android/widget/ProgressBar.html para un ejemplo diferente, pero posiblemente relacionado.

Véase también esta respuesta , especialmente el primer párrafo:

El problema es más probable que usted está ejecutando la pantalla de bienvenida (algún tipo de diálogo como ProgressDialog supongo) en el mismo hilo que todo el trabajo que se está haciendo. Esto evitará que la vista de la pantalla de bienvenida se actualice, lo que puede impedir que se muestre en la pantalla. Necesita mostrar la pantalla de bienvenida, iniciar una instancia de AsyncTask para descargar todos los datos y, a continuación, ocultar la pantalla de bienvenida una vez finalizada la tarea.

Actualización (basada en su actualización y su comentario): No se supone que debe actualizar la interfaz de usuario en ningún subproceso excepto el que crea su actividad. ¿Por qué es imposible que cargues tus recursos en un hilo de fondo?

Primero: onCreate se ejecuta en el subproceso de la interfaz de usuario principal, por lo que no hay actualizaciones de interfaz de usuario hasta que lo deje. Básicamente, se necesita un subproceso para ejecutar tareas de ejecución largas y algún mecanismo para enviar actualizaciones a la interfaz de usuario.
El enfoque más habitual es extender AsyncTask ver este enlace para más información

Supongo que su vista es una vista ampliada y usted llama onDraw para dibujar la vista, así que, tal vez la vista no es 'actualizar' su estado, así que intente esto

 onCreate(Bundle bundle) { setContentView(splash); // splash is the view class loadResources(); splash.setText("this"); splash.invalidate(); boundWebService(); splash.setText("that"): splash.invalidate(); etc(); splash.setText("so on"); splash.invalidate(); } 
  • Android: Obtiene el elemento listview del botón que se hace clic en la vista de lista personalizada
  • Problema de visibilidad de Android con la casilla de verificación
  • addView no funciona
  • Ver paginador androide con imagen de fondo único
  • Cómo configurar el color de fondo de una vista
  • Cómo mostrar / ocultar submenús dentro de NavigationView android
  • El recorte de Android ViewGroup no funciona
  • Android: Cómo realizar cambios en la vista principal de un botón
  • GetLocationOnScreen () vs getLocationInWindow ()
  • ¿Cómo implementar un titular de vista?
  • Error al inflar la vista de clase interna
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.