как непрерывно переключать переключатель между двумя значениями каждые 2 секунды - PullRequest
4 голосов
/ 01 ноября 2011

Я посмотрел код здесь , а также код здесь , но я все еще не могу заставить мой код работать правильно. Со второй ссылкой я могу получить «таймер», который считает на странице, но с первой мой пользовательский интерфейс блокируется. Я пытаюсь создать отдельный поток, который непрерывно переворачивает текст в переключатель текста каждые 3 секунды, пока приложение открыто. Мне нужно, чтобы переключиться между двумя значениями, и попытался что-то вроде следующего:

private Runnable mUpdateTimeTask = new Runnable() {


       public void run() {
           while(true){                                                             
                try {
                    mHandler.post(new Runnable(){
                       @Override
                       public void run() {

                          try {
                            mSwitcher.setText("ON");  
                            Thread.sleep(1000);
                            mSwitcher.setText("OFF");
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                       }
                    }
                    ); 

                }catch (Exception e) {
                    //tv1.setText(e.toString());
                }

             } 
                 }
             };

Где он будет переключаться «вкл» или «выкл» каждые 2 секунды. Мне также нужно иметь возможность обновлять содержимое текстового переключателя из основного интерфейса, но я не дошел до того, что могу попробовать и протестировать это. В дополнение к вышесказанному я также попытался использовать Async Task:

      new AsyncTask<Void, Double, Void>() {
      @Override
      protected Void doInBackground(Void... params) {
          while (true) {
              mSwitcher.setText("ON");
                SystemClock.sleep(2000);
                mSwitcher.setText("OFF");
                SystemClock.sleep(2000);
          } 
      }     
  }.execute();

но это тоже не сработало.

Ответы [ 4 ]

5 голосов
/ 12 декабря 2012

Другой более простой способ достижения этого - использовать viewFlipper вместо viewSwitcher.Это позволяет вам делать все, что вы хотите, используя только макет XML:

<ViewFlipper
    android:id="@+id/viewFlipper1"
    android:autoStart="true"
    android:flipInterval="3000">
        <TextView
            android:id="@+id/on_textview"
            android:text="ON" />
        <TextView
            android:id="@+id/off_textview"
            android:text="OFF" />
</ViewFlipper>

Чтобы сделать его немного красивее, вы также можете определить анимации, которые будут использоваться в viewFlipper:

<ViewFlipper
    android:id="@+id/viewFlipper1"
    android:autoStart="true"
    android:flipInterval="3000"
    android:inAnimation="@android:anim/fade_in"
    android:outAnimation="@android:anim/fade_out">    

Документация AdapterViewFlipper .

2 голосов
/ 01 ноября 2011

попробуйте использовать таймер :

Timer timer = new Timer("desired_name");
timer.scheduleAtFixedRate(
    new TimerTask() {
        public void run() {
            //switch your text using either runOnUiThread() or sending alarm and receiving it in your gui thread
        }
    }, 0, 2000);

Ссылка для runOnUiThread . Вы не можете обновить элементы графического интерфейса из не-пользовательских потоков, поэтому попытка обновить его с помощью doInBackground() метода AsyncTask приведет к ошибке.

1 голос
/ 01 ноября 2011
Timer t = new Timer();
    TimerTask scanTask = new TimerTask() {
        public void run() {
            mHandler.post(new Runnable() {
                        public void run() {
                            mSwitcher.setText(isOn ? "ON" : "OFF");  
                            isOn = isOn? false : true;
                        }
               });
        }};

    t.schedule(scanTask, 0, 2000); 
0 голосов
/ 01 ноября 2011

Я меняю интерфейс, использую обработчик.Сделайте переменную обработчика приватной для Activity и вызовите handler.sendEmptyMessage ().

Вы можете использовать поток или асинхронную задачу для вызова Handler.sendEmptyMessage (ON / OFF).

Еще один способ - использовать Handler.sendEmptyMessageDelayed ().Этот обработчик вызывает себя каждый раз, когда пользователь установил задержанное значение.

...