Intereting Posts
Настройка темы приложения textColor на белый приводит к тому, что текст в тексте контекстного меню будет белым (невидимым) Appcelerator Vs. MonoTouch – Какой из них лучше всего подходит для .NET-разработчика? Как вручную установить java-библиотеки и сохранить / tmp как noexec? Как я могу проверить из Android WebView, если страница «404 страница не найдена»? Вход в Facebook в фрагменте в android Как я могу отладить код doInBackground для AsyncTask Воспроизведение HLS на Android (сравнение альтернатив) Как «FBReader» выполняет разбиение на страницы html-файлов в epub Android – проблемы с анимацией значка ActionBar из фрагментов Android Paint: .measureText () vs .getTextBounds () Потребление памяти огромной памяти в графике Android? – LibGDX Сделайте прозрачный фон значков android в eclipse EditText в режиме прокрутки в android Файл Apk, экспортированный из Android Studio, слишком велик Есть ли способ отключить затухание, что viewPager имеет прокрутку к краям?

Обновление 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(); } 

Solutions Collecting From Web of "Обновление Android TextView в потоке и Runnable"

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

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