如何每2秒在两个值之间连续切换文本切换器

时间:2011-11-01 06:37:44

标签: android multithreading background while-loop

我查看了代码here以及代码here,但我仍然无法让我的代码正常工作。使用第二个链接,我可以获得一个在页面上计数的“计时器”,但是第一个,我的UI锁定。我想要做的是有一个单独的线程,只要应用程序打开,它就会每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秒钟会“开启”或“关闭”。我还需要能够从主UI更新文本切换器内容,但还没有达到我可以尝试测试的程度。除了上述内容之外,我还尝试使用异步任务:

      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 个答案:

答案 0 :(得分:5)

另一种更简单的方法是使用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 Documentation

答案 1 :(得分:2)

尝试使用timer

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

Reference for runOnUiThread。您无法从非ui线程更新gui元素,因此尝试从doInBackground() AsyncTask方法更新它将导致错误。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我更改了UI,使用了处理程序。使处理程序变量对Activity是私有的,并调用handler.sendEmptyMessage()。

您可以使用线程或异步任务来调用Handler.sendEmptyMessage(ON / OFF)。

另一种方法是使用Handler.sendEmptyMessageDelayed()。每次用户设置延迟值后,此处理程序将调用自身。