2011-11-01 109 views
3

我已经查看了代码here以及代码here,但我似乎还是无法让我的代码正常工作。通过第二个链接,我可以得到一个“计时器”,它可以在页面上计数,但是第一次,我的UI锁定。我试图做的是有一个独立的线程,不断翻转文本切换器中的文本,只要应用程序打开,每3秒钟一次。我需要它的两个值之间切换,并且已经尝试类似如下:“开”或“关”每2秒如何连续每两秒在两个值之间切换文本切换器

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

      } 
       } 
      }; 

凡将翻转。我还需要能够从主界面更新文本切换器的内容,但还没有达到我可以尝试和测试的程度。除上述之外,我还尝试使用异步任务:

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

但是这也不起作用。

+1

为什么不使用带有2个textview的viewflipper。并将flipinterval设置为2秒。视图翻转器可以用于自动翻转。 – blessenm

回答

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更新它将导致错误。

+1

感谢您的回答,对于迟到的接受感到抱歉! –

0

我改变了用户界面,使用处理程序。使处理程序变量专用于Activity并调用handler.sendEmptyMessage()。

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

另一种方法是使用Handler.sendEmptyMessageDelayed()。每当用户设置了延迟值后,该处理程序就会自行调用。实现这一点的

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

一种替代更容易的方法是使用一个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