Обновление пользовательского интерфейса Android с помощью streamов

Я пишу приложение Android Chat. Я слушаю подключения и получаю данные, и я вижу это в Log.d , но всякий раз, когда я пытаюсь обновить свой интерфейс, приложение сбой.

Фрагмент кода:

 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()); } } } 

и обновить пользовательский интерфейс, который я использую:

 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()); } 

Приложение продолжает сбой.

Вы не можете трогать что-либо в streamе пользовательского интерфейса из фонового streamа , для этого используйте Handlers , инициализируйте свой фоновый thread передавая ему объект Handler . Когда данные поступают, чтобы использовать handler для отправки сообщения в пользовательский интерфейс. В пользовательском интерфейсе, когда приходит сообщение из фонового thread , просто обновите Views .

Пример fragmentа кода:

в фоновом streamе:

 if(dataArrives){ Message msg = handler.obtainMessage(); msg.what = UPDATE_IMAGE; msg.obj = bitmap; msg.arg1 = index; handler.sendMessage(msg); } 

в streamе пользовательского интерфейса:

 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); } }; 

и передать handler в фоновый thread .

Вы не можете изменять элементы пользовательского интерфейса из streamа, отличного от UI. Попробуйте использовать runOnUiThread .

 runOnUiThread(new Runnable(){ @Override public void run(){ // change UI elements here } }); 

Или просто используйте AsyncTask , это более полезно ИМХО.

 private void yourMethodName(){ new Thread(new Runnable() { @Override public void run() { try { //do some heavy task here on main separate thread like: Saving files in directory, any server operation or any heavy task ///Once this task done and if you want to update UI the you can update UI operation on runOnUiThread method like this: homeActivity.runOnUiThread(new Runnable() { @Override public void run() { txtview.setText("some value"); edittext.setText("some new value"); } }); } catch (Exception e) { //print the error here } } }).start(); } 

Используйте этот метод для обновления вашего пользовательского интерфейса из рабочего streamа, здесь это хорошо объяснено.

Примечание. – Если вы используете progressbar.setProgress(progress) вы можете обновить его непосредственно из рабочего thread потому что метод ProgressBar внутри внутреннего вызова setProgress() использует Handler .

  • Отключить ключ ускорителя ярлыков WPF (текст подчеркивания отсутствует)
  • JTable Right Align Header
  • Что такое MVP и MVC и в чем разница?
  • Объявление пользовательского элемента пользовательского интерфейса Android с использованием XML
  • Как отобразить более трех уровней расширяемого вида списка?
  • Как создать графический интерфейс пользователя на C ++?
  • Android ViewPager с нижними точками
  • Установить альфа / непрозрачность макета
  • Как подключить одну панель к другой
  • Android: что выбрать для значений кода запроса?
  • Применение MVC с помощью JavaFx
  • Давайте будем гением компьютера.