Actualización de la interfaz de usuario de Android mediante subprocesos
Estoy escribiendo una aplicación de chat en Android, estoy escuchando conexiones y recibo datos y puedo verlo en el Log.d, pero siempre que intento actualizar mi interfaz de usuario el fallo de la aplicación .. el código es
private class chatReceiver implements Runnable { @Override public void run() { try { skt = new DatagramSocket(Integer.parseInt(Main.prefs.getString("port_number", "5432"))); DatagramPacket rcvPkt = new DatagramPacket(rcvBuf,rcvBuf.length); String ack = "Hello from our SimpleUDPServer"; byte[] sndBuf = ack.getBytes(); while (true) { Log.d("Server received: " ,"entered loop"); skt.receive(rcvPkt); String rcvMsg = new String(rcvBuf, 0, rcvPkt.getLength(), "UTF-8"); Log.d("Server received: " ,"receiving" + rcvMsg); if (rcvMsg != null) { Log.d("Server received: " ,"not equal null"); // I want to update my UI here } DatagramPacket k = new DatagramPacket(sndBuf, sndBuf.length, rcvPkt.getAddress(), rcvPkt.getPort()); skt.send(k); Log.d("Server sent" ,ack); } } catch (IOException ex) { Log.d("ThreadStart", "Error Starting thread" + ex.getStackTrace()); } } }
Y para actualizar la interfaz de usuario que uso:
- Crear tablas de donuts Similar a Google Fit
- Android cómo hacer que resalte la vista cuando se hace clic?
- LinearLayout: Alineación a la derecha del padre
- Cómo ocultar el botón en la barra de acciones
- Android: ¿Ajusta la pantalla cuando aparece el teclado?
public static void updateUI(Bubble b, View itemView) { TextView txt_display_name = (TextView) itemView .findViewById(R.id.display_name); txt_display_name.setText(b.getDisplay_name()); TextView txt_chat_body = (TextView) itemView .findViewById(R.id.chat_body); txt_chat_body.setText(b.getChat_body()); TextView txt_creation_date = (TextView) itemView .findViewById(R.id.creation_date); txt_creation_date.setText(b.getCreation_time()); }
Mi aplicación sigue estrellándose!
- ¿Cuál es el propósito de requestWindowFeature ()?
- Alineación derecha e izquierda con lineal o relativelayout con texto truncado?
- Cómo llamar a los colores de los recursos de forma dinámica en Android?
- ¿Cuál es el equivalente a Android de findViewById (int) de Android?
- ¿Cómo puedo mejorar la apariencia de una aplicación para Android?
- La inicialización de Android TextToSpeech bloquea / congela el subproceso de UI
- ¿Cómo puedo ejecutar el código en el hilo de la interfaz de usuario en una prueba de Android JUnit sin una actividad?
- TextView y EditText en una sola fila en Android?
No se puede tocar nada en el subproceso ui de un subproceso de fondo, para hacer que los manejadores de uso, inicializar su hilo de fondo pasarlo un objeto de controlador. Cuando los datos llegan, utilice el controlador para enviar un mensaje al ui. En el ui cuando el mensaje del hilo de fondo viene, sólo actualizar las vistas.
algo como esto…
En el hilo de fondo:
if(dataArrives){ Message msg = handler.obtainMessage(); msg.what = UPDATE_IMAGE; msg.obj = bitmap; msg.arg1 = index; handler.sendMessage(msg); }
En el hilo ui:
final Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { if(msg.what==UPDATE_IMAGE){ images.get(msg.arg1).setImageBitmap((Bitmap) msg.obj); } super.handleMessage(msg); } };
Y pasar el manejador a la pista de bakground
No puede cambiar los elementos de interfaz de usuario de un subproceso no UI. Intente usar runOnUiThread .
runOnUiThread(new Runnable(){ @Override public void run(){ // change UI elements here } });
O simplemente utilizar AsyncTask , es más útil IMHO.
Utilice este método para actualizar su interfaz de usuario de hilo de trabajo, aquí se explica muy bien.
** Nota – Si está utilizando ProgressBar.setProgress (progreso), puede actualizar directamente desde el subproceso de trabajo, ya que ProgressBar llama internamente al método setProgress () utilizando el controlador. **
- ¿Utilizas el método onPostCreate ()?
- Android 4.4 KitKat accidente aleatorio (Native crash en /system/lib/libc.so)