Intereting Posts
Удаление apk в альфа-тестировании для загрузки другого с тем же кодом версии Facebook-андроид Программный угол изменения градиента Как прокрутить edittext внутри прокрутки ListView и прокрутка Как переносить объявления Android TextView? Проверка нарушений android: minSdkVersion автоматически Указание фильтра намерения SEND (совместного использования) для службы Как получить данные из AsyncTasks doInBackground ()? Держите соединение открытым и считайте данные, пока он не будет принудительно закрыт Ошибка при передаче объекта из одной операции в другую (с использованием метода Parcelable) Отключить события касания RecyclerView (чтобы предотвратить пользовательские касания)? Событие изменения позиции маркера Метод раздувания для моей привязки не найден (с использованием Android, привязка данных). Исключение в потоке «pool-1-thread-1» java.lang.NoClassDefFoundError: org / eclipse / эфир / spi / connector / Transfer $ State

Обновление Android TextView в потоке и Runnable

Я хочу сделать простой таймер в Android, который обновляет TextView каждую секунду. Он просто подсчитывает секунды, как в Minesweeper.

Проблема в том, что я игнорирую tvTime.setText (…) (сделайте это //tvTime.setText (…), в LogCat будет напечатан следующий номер каждую секунду. Но когда я хочу установить этот номер на TextView (созданный в другом потоке), программа вылетает из строя.

У кого-нибудь есть идея, как легко решить эту проблему?

Вот код (метод вызывается при запуске):

private void startTimerThread() { Thread th = new Thread(new Runnable() { private long startTime = System.currentTimeMillis(); public void run() { while (gameState == GameState.Playing) { System.out.println((System.currentTimeMillis() - this.startTime) / 1000); tvTime.setText("" + ((System.currentTimeMillis() - this.startTime) / 1000)); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }); th.start(); } 

РЕДАКТИРОВАТЬ:

Наконец то я понял. Вот решение для тех, кто интересуется.

 private void startTimerThread() { Thread th = new Thread(new Runnable() { private long startTime = System.currentTimeMillis(); public void run() { while (gameState == GameState.Playing) { runOnUiThread(new Runnable() { @Override public void run() { tvTime.setText(""+((System.currentTimeMillis()-startTime)/1000)); } }); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }); th.start(); } время private void startTimerThread() { Thread th = new Thread(new Runnable() { private long startTime = System.currentTimeMillis(); public void run() { while (gameState == GameState.Playing) { runOnUiThread(new Runnable() { @Override public void run() { tvTime.setText(""+((System.currentTimeMillis()-startTime)/1000)); } }); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }); th.start(); } 

    Пользовательский интерфейс может обновляться только через поток пользовательского интерфейса. Вам нужен обработчик для публикации в теме пользовательского интерфейса:

     private void startTimerThread() { Handler handler = new Handler(); Runnable runnable = new Runnable() { private long startTime = System.currentTimeMillis(); public void run() { while (gameState == GameState.Playing) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } handler.post(new Runnable(){ public void run() { tvTime.setText("" + ((System.currentTimeMillis() - this.startTime) / 1000)); } }); } } }; new Thread(runnable).start(); } 

    Кроме того, вы можете просто сделать это в своем потоке всякий раз, когда хотите обновить элемент пользовательского интерфейса:

     runOnUiThread(new Runnable() { public void run() { // Update UI elements } }); 

    Вы не можете получить доступ к элементам пользовательского интерфейса из потоков, отличных от UI. Попробуйте окружить вызов setText(...) другим Runnable а затем просмотрите метод View.post(Runnable) .

    В качестве опции используйте runOnUiThread () для изменения свойств представлений в основном потоке.

      runOnUiThread(new Runnable() { @Override public void run() { textView.setText("Stackoverflow is cool!"); } });