Intereting Posts
Replace () не работает должным образом с несколькими фрагментами Как установить текст в строке состояния? Есть ли команда orroid shell или adb, которую я мог бы использовать для получения IMEI / MEID устройства? Android findViewById () в пользовательском представлении Переопределить API для извлечения png-изображения В чем разница между Java.Net.Uri и Android.Net.Uri Nexus 5 не будет отображаться в Eclipse Внедрение ListView в виджетах Android Spinner с пустым выбором по умолчанию Настройка пальца в определенную позицию (а не смещение) программы поиска программно? Как объединить данные из двух отдельных таблиц в один курсор? Как избежать автоматического появления клавиатуры Android при запуске активности Тестирование этой кнопки запускает операцию с Robolectric Intent.FLAG_ACTIVITY_CLEAR_TOP не удаляет стек активности Как переместить / переименовать файл из внутреннего хранилища приложений во внешнее хранилище на Android?

Приостановка с помощью обработчика и 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 в обработчике.

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