2011-06-25 38 views
3

所以我想創建我的應用程序是「頻閃」光效應。時間延遲的Android

要做到這一點,我需要時間延遲,100ms的其他的20

下面一個是我使用的代碼。

Thread timer = new Thread(); 
    long longTime = 100; 
    long shortTime = 20; 
    for (int x = 0; x < 2000000; x++) 
    { 
     layout.setBackgroundColor(background); 
     try { 
      timer.sleep(longTime); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     layout.setBackgroundColor(backgroundBlack); 
     try { 
      timer.sleep(shortTime); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

我的問題是,當我點擊按鈕來調用代碼,沒有任何反應。所以我已經做了一些調試,並且很確定這是定時調用。我從來沒有在Java中編程,所以我不確定如何調用線程休眠。

回答

4

你可以使用如下處理程序來實現這一目標。

public class Strobe extends Activity { 

    private LinearLayout mLinearLayout; 

    private Handler mHander = new Handler(); 

    private boolean mActive = false; 
    private boolean mSwap = true; 

    private final Runnable mRunnable = new Runnable() { 

     public void run() {   
      if (mActive) { 
       if (mSwap) {      
        mLinearLayout.setBackgroundColor(Color.WHITE); 
        mSwap = false; 
        mHander.postDelayed(mRunnable, 20); 
       } else { 
        mLinearLayout.setBackgroundColor(Color.BLACK); 
        mSwap = true; 
        mHander.postDelayed(mRunnable, 100); 
       } 
      }   
     } 
    }; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     mLinearLayout = (LinearLayout) findViewById(R.id.strobe); 
     startStrobe(); 
    } 

    private void startStrobe() {   
     mActive = true; 
     mHander.post(mRunnable); 
    } 
} 

將主題設置爲活動使其全屏。

android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 
+0

我改變了findViewByID(R.id.strobe);在您的代碼linearLayout,因爲這就是它被稱爲,粘貼,並將android:onClick更改爲「頻閃」。完成所有工作後,我運行它並單擊按鈕,強制關閉。 – Cistoran

+0

logcat說什麼?可以隨時從這裏http://www.assembla.com/code/rochdev-android/subversion/nodes/ExampleStrobe – rochdev

+0

簽出整個Eclipse項目當我調試它,Eclipse是告訴我線程被掛起,因爲它拋出一個IllegalStateException – Cistoran

1

你的問題是,你是不是在線程中運行。爲了在線程中運行代碼,你必須重寫它的run()方法。根據您當前的代碼,以下內容可能會捕獲您想要執行的操作。

Thread timer = new Thread(){ 
    public void run(){ 
     long longTime = 100; 
     long shortTime = 20; 
     for (int x = 0; x < 2000000; x++) 
     { 
      layout.setBackgroundColor(background); 
      try { 
       Thread.sleep(longTime); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      layout.setBackgroundColor(backgroundBlack); 
      try { 
       Thread.sleep(shortTime); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

timer.start(); 

但是,線程在Android操作系統中表現不佳。對於您的應用程序,使用Android服務可能會更好。見http://developer.android.com/guide/topics/fundamentals/services.html

+0

解決了這個問題,它將背景設置爲白色,但在此之後它永遠不會改變。 – Cistoran

+0

我添加開始後,它將背景更改爲白色,然後強制關閉。 – Cistoran

+0

是的,正如我所說的,線程在Android中可能存在問題。嘗試使用服務。 –