He estado leyendo mucho sobre hilos, manipuladores, trabucos, etc. y estoy muy confundido. En mi aplicación, quiero que la primera actividad inicie un trabajador en segundo plano. Este trabajador de fondo solicitará continuamente datos de un socket TCP y (con suerte) publicará la nueva información en el hilo de la interfaz de usuario a medida que lleguen los datos. Si el usuario hace una transición a una nueva actividad, el fondo necesita seguir haciéndolo, pero solo envía diferentes mensajes al hilo de la interfaz de usuario para que pueda actualizar el nuevo diseño en consecuencia.Android: ¿forma correcta de pasar un mensaje desde el hilo de fondo al hilo de la interfaz de usuario?
aquí es lo que tengo hasta ahora ... Esto está en mi archivo principal actividad
public class MyTCPTest extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// set the layout
setContentView(R.layout.main);
// create a handler to handle messages from bg thread
Handler handler = new Handler();
BgWorkerThread bgw = new BgWorkerThread();
bgw.start();
}
en otro archivo defino mi subproceso de trabajo de fondo como este ...
public class BgWorkerThread extends Thread {
@Override
public void run(){
while(true)
{
try {
// simulate a delay (send request for data, receive and interpret response)
sleep(1000);
// How do I send data here to the UI thread?
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Si la interfaz de usuario cambia a una actividad diferente ¿Esta cadena seguirá ejecutándose? Además, ¿cómo sabe este hilo a qué actividad enviar el mensaje? Obviamente, quiero que siempre envíe los datos a la Actividad que está actualmente activa. ¿Eso sucede automáticamente?
Finalmente, cuando la interfaz de usuario cambia a una actividad diferente, el bgworker necesita ser notificado para que pueda comenzar a solicitar datos que sean relevantes para el nuevo diseño de la actividad. ¿Cuál es la mejor manera de informar al trabajador sobre el cambio? ¿No podría simplemente crear un método público en la clase BgWorkerThread que podría invocarse cuando se carguen las Actividades?
Travis gracias por el enlace, pero todavía estoy confundido. La diferencia es que todo tu código parece estar en la misma clase. Mi asistente social es su propia clase que amplía Thread. Esta es una clase separada de la clase de Actividad, entonces, ¿cómo puedo acceder al controlador de esa clase/actividad? – PICyourBrain