Установите для полученных TCP-клиентом данных (внешний поток) значение TextView (основной поток) - PullRequest
0 голосов
/ 10 октября 2018

Я создал приложение для Android, которое обрабатывает соединение клиента TCP с AsyncTask.Взаимодействие сервер-клиент работает отлично.Теперь у меня есть вопрос о реализации, которую я сделал для передачи строки из клиентского потока в основной поток:

Я хочу установить полученную строку из клиентского потока в TextView, и неосновнуюпотоки не могут взаимодействовать с пользовательским интерфейсом приложения на Android.

Поэтому я создал временный поток на главном, который каждые 100 мс проверяет, получены ли данные в потоке клиента, и затем использует его.

Вот упрощенные фрагменты кода:

Поток клиента (нет доступа к пользовательскому интерфейсу)

private volatile boolean hasReceivedData;
private String receivedData;

 ...

receivedData = inBuffer.readLine();
hasReceivedData = true;

 ...

public String getReceivedData() {
    return receivedData;
}

Основной поток приложения (Доступ к пользовательскому интерфейсу)

private ClientThread client;
private TextView textView;
private Thread dataChecker;

 ...

dataChecker = new Thread(new Runnable() {
        @Override
        public void run() {
            while (!client.hasReceivedData()) {
                Utils.sleep(100);
            }
            textView.setText(client.getReceivedData());
        }
});
dataChecker.start();

Я хотел бы знать, есть ли лучший / правильный способ достижения этого или более простой.

Заранее спасибо!

1 Ответ

0 голосов
/ 10 октября 2018

Ваш AsyncTask имеет метод onPostExecute(), который запускается после завершения потока doInBackground().Используйте это, чтобы обновить пользовательский интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...