Red de conocimiento informático - Material del sitio web - Cómo actualizar vistas usando controladores e hilos

Cómo actualizar vistas usando controladores e hilos

1. Habilite los subprocesos en el método onCreate() para actualizar la interfaz de usuario

vista simple

clase pública MasterActivity extiende la actividad {

TextView tv = null;

Botón btn = null;

@Override

public void onCreate(Bundle saveInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

System.out.printl(Thread.currentThread(.getName()))id.text);

btn = (Button)findViewById(R.id.btn);

//* ¡Abre un nuevo hilo en onCreate para actualizar la interfaz de usuario! */

Subproceso = new Thread(new Runnable() {

@Override

public void run() {

Sistema .out.println(Thread. currentThread().getName() ": " Thread.currentThread().getId());

tv.setText("¡Actualice la interfaz de usuario correctamente!");

p>

btn.setText("¡Actualice la interfaz de usuario correctamente!");

}});

thread.start(); >

}

}

Haz lo que quieras, ¡no se informarán errores ni excepciones! Pensé que el hilo abierto y el hilo de la interfaz de usuario (el hilo principal) eran el mismo hilo, pero desafortunadamente, ¡sus ID de hilo ni siquiera se acercan!

¡No sé por qué no hay problema al abrir un hilo secundario aquí para actualizar la interfaz de usuario! Realmente no lo entiendo

2. En actividades como onResume y onStart, los métodos de devolución de llamada comienzan con on Anyway

ver plano

@ Override

. p>

protected void onRestart() {

super.onRestart();

/* Abra un nuevo hilo en onRestart para actualizar la interfaz de usuario**

Hilo de hilo = nuevo hilo(new Runnable() {

@Override

public void run() {

System.out.println (Thread. currentThread().getName() ": " Thread.currentThread().getId());

tv.setText("¡La actualización de la interfaz de usuario fue exitosa!");

btn. setText("¡La actualización de la interfaz de usuario fue exitosa!");

}});

thread.start();

}

> ¡Perdóneme si presiono el botón Atrás para iniciar el programa, o presiono el botón Inicio para iniciar el programa nuevamente!

¡Después de unos pocos giros, sucedió algo anormal! La información es la siguiente:

android.view.ViewRoot$CalledFromWrongThreadException:

Significado: solo el hilo principal puede actualizar la interfaz de usuario.

Solución: Agregar el método postInvalidate().

vista simple

@Override

void protegido onRestart() {

super.onRestart();

/*Abra un nuevo hilo en onRestart para actualizar la interfaz de usuario*

Subproceso = new Thread(new Runnable() {

@Override

public void ejecutar() {

System.out.println(Thread.run())out.println(Thread.currentThread().getName() ": " Thread.currentThread().getId());

tv.postInvalidate();

btn.postInvalidate()postInvalidate();

tv.setText("¡Actualice la interfaz de usuario correctamente!"); /p>

btn.setText("¡Actualice la interfaz de usuario correctamente!");

}});

thread.start(); }

p>Método postInvalidate(), código fuente:

vista simple

public void postInvalidate() {

postInvalidateDelayed(0 );

}

public void postInvalidateDelayed(long delayMillisegundos) {

// Solo intentamos usar AttachInfo, porque la invalidación no tiene significado

// Si no estamos adjuntos a la ventana

if (mAttachInfo != null) {

Mensaje msg = Message.obtain();

msg.what = AttachInfo.INVALIDATE_MSG;

msg.obj = esto;

mAttachInfo.mHandler.sendMessageDelayed(msg, delayMillisegundos);

}

}

¡De hecho, esta es una llamada al mecanismo de manejo de mensajes del controlador! Este método se puede utilizar para actualizar la interfaz de usuario directamente en un hilo secundario.

También hay un método invalidate (), ¡más sobre eso más adelante!

3. Abra un hilo en el evento del botón para actualizar la interfaz de usuario

vista simple

la clase pública MasterActivity extiende la actividad {

TextView tv = null;

Botón btn = null;

@Override

public void onCreate(Bundle saveInstanceState) {

super.onCreate (savedInstanceState );

setContentView(R.layout.main);

System.out.println(Thread.currentThread().getName() ": " Thread.currentThread() .getId ());

tv = (TextView)findViewById(R.id.text);

btn = (Botón)findViewById(R.id.btn); hilo = nuevo hilo (nuevo Runnable() {

@Override

public void run() {

System.out.println(Thread.currentThread () .getName() ": " Thread.currentThread().getId());

Mensaje msg = mHandler.obtainMessage();

msg.what = 1;

msg.sendToTarget();

}});

thread.start();

thread.sendToTarget();