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:

 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!

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. **

  • Nueva actividad en Android "entrar desde el lado"
  • Hay un iUI para el Android
  • Android: ¿Cómo cambio la imagen de un ImageButton cuando el usuario suelta el botón?
  • ¿Cómo puedo reducir el relleno interno alrededor del texto dentro de un objeto de botón de Android?
  • Añadir dinámicamente una vista al diseño de la actividad
  • Simple AlarmManager ejemplo para disparar una actividad en 10 minutos
  • ¿Hay una manera de desactivar / editar el desvanecimiento que una vista de lista tiene en sus bordes?
  • ¿Cuál es la diferencia entre android: lineSpacingExtra y android: lineSpacingMultiplier?
  • Mejor equivalente de Android para iOS Tab Bar Controller
  • Android - Creación de listview con encabezados flotantes
  • Animación de botón de acción flotante de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.