Mensajería al hilo de la interfaz de usuario
Estoy desarrollando una aplicación serialport para módulos knx en android. Puedo enviar y recibir elogios a knx modulde. Quiero cambiar ui (por ejemplo las propiedades del botón) cuando reciba un mensaje de serialport. Lo intenté con los manejadores, pero no puedo cambiar ui. ayúdame plss
@Override public void OnSerialsData (buffer final del byte [], tamaño int final) {….}
- Android - progressdialog no se muestra en AsyncTask
- Hace TimerTask ejecutando en nuevo hilo
- ¿En qué hilo se ejecuta onReceive () de un BroacastReceiver registrado con LocalBroadcastManager?
- Problema con la cámara androide y seguridad de hilo
- Android VideoView setVideoURI bloquea el subproceso de la interfaz de usuario
es mi función del oyente del serialport que llama insine ReadThread. Este hilo está empezando en el paquete differend de mi actividad. Quiero enviar un mensaje en este método a la actividad principal.
- Cómo implementar un Runnable con un no-bloqueador Looper / Handler
- Ejecución de múltiples servicios
- Anotaciones de método Android para evitar que la llamada se realice en el subproceso de GUI
- Cómo pasar un argumento a un hilo
- Utilizar Otto para actualizar un listadapter de un GcmListenerService
- Async tarea no funciona correctamente (doInBackground no se ejecuta) cuando el servicio se ejecuta en segundo plano, Android
- Aplicación android se estrella en el cambio de url de vista web
- ¿Qué sucede con el subproceso como onDestroy se llama cuando se gira el dispositivo
Puede utilizar Activity.runOnUiThread () para comunicarse con el subproceso de la interfaz de usuario. Obtenga más información sobre los procesos y los subprocesos , especialmente sobre los subprocesos de trabajo .
Por ejemplo, dentro de su OnSerialsData
, puede llamar al
mActivity.runOnUiThread(new Runnable() { public void run() { mActivity.mButton.setText("message arrived!"); } }
primero tienes que crear un controlador estático dentro de tu actividad principal:
public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } public static Handler myHandler = new Handler(){ @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); Log.e("Test", msg.getData().getCharSequence("MAINLIST").toString()); } }; }
entonces en su clase socket:
public void OnSerialsData(final byte[] buffer, final int size) { Message msg = MainActivity.myHandler.obtainMessage(); Bundle bundle = new Bundle(); bundle.putCharSequence("MAINLIST", "IS_OK"); msg.setData(bundle); MainActivity.myHandler.sendMessage(msg); }
pero debe asegurarse de que su controlador debe crearse antes de llamar al método OnSerialsData.
Espero que esta ayuda.
sólo extendiendo @auselen respuesta.
Crea en tu actividad lo siguiente:
public void messageReceived(final String msg){ runOnUiThread(new Runnable() { @Override public void run() { // Put here your code to update the UI } }); }
y luego puede llamar a esto desde cualquier clase que tenga una referencia a su actividad. Si la clase no tiene una referencia a la actividad, entonces debe pasar la referencia a ella.