Обновление пользовательского интерфейса 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()); } 

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

5 Solutions collect form web for “Обновление пользовательского интерфейса Android с помощью streamов”

Вы не можете трогать что-либо в 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 .

  • Почему этот код Parallel.ForEach заморозит программу?
  • Анимировать обновление ProgressBar в Android
  • Эффект JavaFX на фоне
  • Переместить макеты, когда отображается мягкая клавиатура?
  • Java swing JComponent "размер"
  • Мероприятия по событиям в саперах
  • Как сделать фотокамеру доступным?
  • Qt сигнализирует по streamам, один - stream GUI?
  • Как отобразить более трех уровней расширяемого вида списка?
  • Как добавить дополнительную кнопку в строку заголовка windows?
  • Как сделать canvas с Swing?
  • Interesting Posts

    Отключение начального экрана MS Office 2013?

    Прокладка-дно / верхняя часть в макете flexbox

    Получить IIS6 для обслуживания файлов JSON (в том числе POST, GET)?

    Apache без подключения к Интернету

    Нет устройств воспроизведения в Windows XP

    Amazon S3 CORS (совместное использование ресурсов для разных источников) и загрузка междоменных шрифтов Firefox

    Какие файлы открываются конкретным приложением?

    Git Bash Здесь, в ConEmu, встроенном в проводник Windows

    Переадресация агента не работает

    Команда bash / fish для печати абсолютного пути к файлу

    Я вымыл свой USB-накопитель. Любые долгосрочные риски?

    Ошибка WCF. Не удалось найти элемент конечной точки по умолчанию, который ссылается на контракт UserService.UserService.

    Автоматизировать диалог сохранения для IE9 (vba)

    Как сбрасывать список процессов во время всплеска процессора или всплеска памяти в Windows 10?

    Как Z3 обрабатывает нелинейную целочисленную арифметику?

    Давайте будем гением компьютера.