Приостановка с помощью обработчика и postDelayed в android - программирование
Подтвердить что ты не робот

Приостановка с помощью обработчика и postDelayed в android

Я очень новичок в программировании на андроидах, поэтому, пожалуйста, простите мне noobie-ness. Я пытаюсь создать очень простое действие, которое будет иметь один TextView в середине макета и просто переключится на другой текст каждые пару секунд. Например, TextView скажет "text1", приостановит на пару секунд, затем скажет "text2 и снова приостановит". В конце концов, я хочу добавить больше текстов и заставить их все цикл один за другим. Я знаю, что это похоже на супер простая вещь, но в настоящее время я в основном пытаюсь узнать о потоках и обработчиках. В любом случае, я прочитал, как мы должны хранить длинные вещи из потока пользовательского интерфейса, чтобы предотвратить ошибку, поэтому я решил использовать обработчик просто переключаться между 2 текстами на экране. К сожалению, я не могу заставить это работать. Вот какой код:

public class MainActivity extends Activity {

String[] myarray = {"text1" , "text2"};
int arraylength = myarray.length;
int count;
Handler handler = new Handler();

TextView mytexts;

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

    mytexts = (TextView)findViewById(R.id.my_texts);
    mytexts.setText(myarray[0]);

    Thread t = new Thread( new Runnable(){
        public void run() {
            for (int count = 0; count < arraylength; count++){
                handler.postDelayed(new Runnable(){
                    public void run() {
                        mytexts.setText(myarray[1]);
                    }                   
                }, 7000);
            }
        }
    });
    t.start();
    }
}

Из того, что я вижу в logcat, обработчик, похоже, запускает postDelayed один за другим (в моем случае кода он не ждет 7 секунд, когда postDelay выполняет другое postDelayed). Кроме того, я хотел бы сделать 1 в "mytexts.setText(myarray [1])"; быть таким же, как "count" в цикле for, чтобы он мог быть таким же, как одна из строк в массиве, но это дает мне ошибку. Я застрял в этом часами, и другие примеры, которые я нашел в Интернете, кажутся слишком сложными для кого-то вроде меня, который в основном хочет убрать основы, прежде чем я смогу заняться другими делами. Любая помощь вообще с любым из этого была бы высоко оценена. Спасибо.

4b9b3361

Ответ 1

postDelayed не блокирует, то есть добавляет его в очередь, я сделаю это позже. Так что вы, вероятно, видите, все обновления текста происходят вместе на 7-й секунде. Я говорю это, потому что вы postDelay ing из метода onCreate, когда на самом деле вы, вероятно, захотите сделать это от onResume или даже onPostResume.

Также нет причин создавать поток для добавления runnables в очередь сообщений. Ваш код должен выглядеть следующим образом: (Обратите внимание на время задержки множителя)

@Override
protected void onResume() {
    super.onResume();
    for (int count = 0; count < arraylength; count++){
        handler.postDelayed(new Runnable(){
            @Override
            public void run() {
                mytexts.setText(myarray[count]);
            }
        }, 7000 * (count + 1));
    }
}

Ответ 2

Это потому, что ваш цикл устанавливает все ваши обработчики для запуска через 7 секунд не через 7 секунд после друг друга, а через 7 секунд. Вы можете добавить метод postDelayed или использовать метод postAtTime в обработчике.

Кроме того, вам не нужно делать это в потоке, вы можете полностью избавиться от него.