Цикл в 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 шт):
Попробуйте так:
@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
