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

  • Buenos ejemplos de tours en la aplicación / tutoriales / tutoriales en Android o iPhone
  • ¿Cómo hace PocketCasts esta transición / efecto?
  • ¿Cómo puedo crear un panel de botones con una línea divisora ​​simple, o sin divisores, en Android?
  • Animar actividad que no es parte de tu aplicación
  • "Compatibilidad-v4-r4.jar" falta en Maven Repo
  • ¿Cómo funciona llamando a Snackbar.make () de un hilo no-UI?
  • Cómo configurar el estilo o la fuente a texto de un TextView en android?
  • Android: el botón rápido presiona resultados en múltiples instancias de intención
  • Cómo dar una línea debajo de la vista de texto en android
  • Androide basado en turnos multijugador personalizado invitar pantalla
  • Unity3d - Hilo de interfaz de usuario independiente para Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.