Intereting Posts
Android – программно создает представление progressBar Первоначальное уменьшение масштаба веб-представления Android Appcompat v21 Предварительная леопапка панели инструментов Что такое RestrictionPolicy и как заставить его заткнуться? Когда используется Snackbar isQueued ()? (Как поставить в очередь закусочную) Как импортировать внешний шрифт / шрифт в ANDROID STUDIO? При прокрутке пользовательского ListView изменяется значение флажка Com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException: не удалось установить все Режим «Дозировка» и «Передний план» Не удалось разрешить суперкласс класса Landroid / support / v4 / app / FragmentActivity Как нарисовать текст с разными штрихами и цветами заливки? Как обновить интерфейс от Android-сервиса, используя RxJava / RxAndroid Android: получите список друзей в facebook Как вызвать поведение ActionBar ContextMenu? Почему Glide не загружает изображение из идентификатора ресурса в мой ImageView?

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

Я очень новичок в программировании на 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, чтобы он мог быть таким же, как одна из строк в массиве, но это дает мне ошибку. Я застрял в этом часами, и другие примеры, которые я нашел в Интернете, кажутся слишком сложными для кого-то вроде меня, который в основном хочет убрать основы, прежде чем я смогу заняться другими делами. Любая помощь вообще с любым из этого была бы высоко оценена. Спасибо.

Solutions Collecting From Web of "Приостановка с помощью обработчика и postDelayed в android"

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

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

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