2010-11-24 5 views
2
view.setText("hello"); 
wait(1000); 
view.setText("world"); 

Когда я вызываю вышеуказанную функцию, представление не показывает «привет» вообще. Текст обновляется только после завершения полной функции. Что мне нужно вызвать, чтобы увидеть «привет»?Обновления TextView в Android

+0

вы можете поделиться еще какой-то код? – st0le 2010-11-24 07:56:47

ответ

5

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

Threading решит проблему, но вам действительно не нужна нить для того, что вы здесь делаете (также вы не должны обновлять пользовательский интерфейс из фонового потока, вам нужно будет использовать обработчик для отправки сообщение).

Вы должны использовать обработчик самостоятельно, чтобы сделать это простое обновление, потому что оно не использует дополнительный поток в приложении. Вы можете использовать метод postDelayed, чтобы он возвращал ваш поток пользовательского интерфейса в определенное время.

Эта статья http://developer.android.com/resources/articles/timed-ui-updates.html охватывает реализацию временного обновления пользовательского интерфейса и довольно прямолинейна.

Чтобы преобразовать ваш пример:

//member variable 
private Handler mHandler = new Handler(); 

//In your current Method 
view.setText("hello"); 
mHandler.postDelayed(mUpdateTimeTask, 1000); 

//Member variable 
private Runnable mUpdateTimeTask = new Runnable() { 
    public void run() { 
     view.setText("world");  
    } 
}; 
0

Я думаю, что знаю, в чем проблема.

При изменении объекта пользовательского интерфейса он изменяет свое состояние, но не непосредственно на экране. каждая система работает немного по-другому, но основная логика такая же

Основной цикл:

1) модификации элементов 2) обновить экран.

, что происходит здесь изменения в привет ждать изменения в мировой обновления.

вы делая основной поток ждать, но интерфейс никогда не обновит между временем

, чтобы решить эту проблему у вас есть несколько способов:

-thread модификации так, что ваше ожидание не влияет на отображение что-то вроде

new Thread(new Runnable(){ 
    public void run(){ 
     wait(1000); 
     view.setText(); 
    } 
} 
  • недействительным вид. это способ оповестить дисплей о том, что что-то изменилось, и его нужно перерисовать.
+0

У вас есть проблема ... он блокирует поток пользовательского интерфейса с призывом ждать, но ваше решение не совсем правильно. Вы не должны обновлять пользовательский интерфейс из фонового потока. Вы должны использовать обработчик и отправить сообщение обратно в поток пользовательского интерфейса, чтобы обновить представление. – 2010-11-24 08:16:30

1

Я нашел этот код на центре разработчиков и работает отлично:

view.setText("hello"); 
new CountDownTimer(1000, 100) { 
    TextView view = (TextView) findViewById(R.id.view); 

    public void onTick(long millisUntilFinished) { } 

    public void onFinish() {   
     view.setText("World!") 
    } 
}.start(); 
Смежные вопросы