Programación de Android Thread, ¡cometí un error al usar Toast para generar información en el método run() de Thread!
La interfaz de usuario no se puede actualizar en un hilo secundario. Este es un ejemplo que escribí antes. Echa un vistazo y usa el mecanismo de mensajes del controlador.
La clase pública HandlerDemoActivity extiende la actividad implementa OnClickListener {<. /p >
Botón btn1,btn2;
ProgressBar ProgressBar;
UpdateDataHandler updateDataHandler;
HandlerThread handlerThread;
/* * Se llama cuando se crea la actividad por primera vez */
@Override
public void onCreate(Bundle saveInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn1 = (Botón)findViewById(R.id.btn1);
btn2 = (Botón)findViewById( R. id.btn2);
ProgressBar = (ProgressBar)findViewById(R.id.progressBar1);
btn1.setOnClickListener(this);
btn2 .setOnClickListener (this);
}
/**
* Personaliza una clase para heredar la clase Handler y anular la función handleMessage,
* Y se requiere un constructor con un objeto Looper
* Bucle para detectar si hay un mensaje. Si hay un mensaje, se llamará a handleMessage para recuperar los datos.
* Si no hay ningún mensaje, ingrese al estado de espera
* @author Administrator
*
*/
class UpdateDataHandler extends Controlador{
public UpdateDataHandler(Looper looper){
super(looper);
}
@Override
public void handleMessage(Mensaje mensaje) {
super.handleMessage(msg);
System.out.println("----------" + Thread.currentThread().getId()) ;
ProgressBar.setProgress(msg.arg1); //Obtiene datos de la cola de mensajes y actualiza el control
updatet.
eDataHandler.post(printRunnable);
}
}
Ejecutable printRunnable = new Runnable() {//Implementar una clase de subproceso
int i = 0;
@Override
public void run() { //Reescribe la función de ejecución en la clase de subproceso
i += 20;
Message msg = updateDataHandler.obtainMessage(); //Obtener el objeto de mensaje del controlador
msg.arg1=i //Colocar datos en el objeto de mensaje
//msg.obj = obj;//También puedes enviar algunos objetos
//msg.setData();//Puedes enviar objetos Bundle
try {
Thread.sleep(1000); //Pausa durante 1 segundo
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(i);
if(i > 100) //Juzga cuando la variable llega a 100, la operación finaliza
{
updateDataHandler.removeCallbacks(printRunnable);//Libera la clase de subproceso del controlador
return;
}
//msg.sendToTarget (); //También puedes usar esta función para enviar mensajes
updateDataHandler.sendMessage(msg); //Coloca el objeto del mensaje en la cola de mensajes
}
};
@Override
public void onClick(Ver v) {
if(v == btn1)
{
handlerThread = new HandlerThread(""); // HandlerThread es un Thread y hereda de Thread. Conserva una referencia a la instancia de Looper
handlerThread.start(); //Asegúrese de llamar a la función de inicio del hilo
updateDataHandler = new UpdateDataHandler(handlerThread.getLooper());
updateDataHandler.post(printRunnable);
System.out.println("hilo principal" + Thread.currentThread().getId());
}
}
}