Cómo actualizar vistas usando controladores e hilos
vista simple
clase pública MasterActivity extiende la actividad {
TextView tv = null; p >
Botón btn = null;
@Override
public void onCreate(Bundle saveInstanceState) {
super.onCreate(savedInstanceState); p >
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>
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** p>
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);
} p>
}
¡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();