Цикл в Android с задержкой

проблема что я пытаюсь заменить тест объекта через цикл, он меняется всё хорошо, но мне нужно чтобы это было с задержкой. я вписал Thread.sleep(1000); но за этого он в самом начале показывает белый экран. после чего выводит последний элемент массива

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Str str = new Str();
    Thread thr = new Thread(str);

    thr.start();

}
public class Str implements Runnable {
    public void run() {
        TextView text = findViewById(R.id.message);
        String[] array = new String[]{"Hi", "it`s", "my", "feast", "mobile", "application"};
        for (int i = 0; i < array.length; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
            text.setText(array[i]);
        }
    }
};

введите сюда описание изображения


Ответы (2 шт):

Автор решения: JustAnotherCoder

Попробуйте так:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    TextView text = findViewById(R.id.message);
    // Обработчик сообщений.
    // Обравбатывает сообщения в главном (UI) потоке.
    Handler handler = new Handler(Looper.getMainLooper());
    // Отправляем сообщение
    handler.post(new Runnable() {
        final String[] array = new String[]{"Hi", "it`s", "my", "feast", "mobile", "application"};
        int index = 0;
        @Override
        public void run() {
            if (index < array.length) {
                text.setText(array[index++]);
                // Отправляем сообщение с задержкой.
                handler.postDelayed(this, 1000);
            }
        }
    });
}
→ Ссылка
Автор решения: Зонтик

Мне кажется,что проще использовать класс java.util.Timer. Он сам создаёт новый поток и предназначен как раз для того, чтобы выполнять действие через какое-то время несколько раз, и именно это вы и пытаетесь сделать.

Ваша проблема в том, что когда вы останавливаете поток, то вы на самом деле "замораживаете" весь UI. Что происходит "за кулисами", очень хорошо и подробно описано здесь, и пересказывать это я не вижу смысла.

Как использовать таймер? Вообще, обычно создают целый класс для таймера, что-то вроде этого:

import java.util.TimerTask;
import java.util.Timer;

public class SomeClass extends TimerTask{
  @Override
  public void run(){
     //Какие-то действия
  }

  public void test(){
    Timer timer = new Timer();
    timer.schedule(this,0,1000);//Назначаем таймер
  }
}

Но в вашем случае лучше использовать анонимный класс:

import java.util.TimerTask;
import java.util.Timer;

...

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main);

    String[] array = new String[]{"Hi", 
    "it`s", "my", "feast", "mobile", "application"}; //Ваш массив
    int counter; //Переменная-счётчик, почти как в цикле

    Timer timer = new Timer(); //Создаём объект класса Timer
    timer.schedule(new TimerTask(){ //Назначаем таймер, используя анонимный класс
       @Override
       public void run(){ 
          text.setText(array[counter]);
          counter++; //Увеличиваем счётчик на 1
          if(counter == array.size){
             timer.cancel(); //Отменяем таймер, когда массив закончится
          }
       }
    },0,1000); //Таймер будет выполнять действие раз в 1000 милисекунд

 
}

Надеюсь, мой ответ полезен. Вот ещё ссылка на документацию: https://docs.oracle.com/javase/6/docs/api/java/util/Timer.html

→ Ссылка