2011-06-25 19 views
3

私はアプリで「ストロボ」ライト効果を作成しようとしています。 Androidでの遅延時間

は、私はここで20

の他の100msの一つは、私が使用しているコードで、時間遅延を必要とするこれを行うにしてください。

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が "Strobe"に変更されているためです。結局、それを実行してボタンをクリックすると、強制的に閉じます。 – Cistoran

+0

logcatとは何ですか?ここからEclipseプロジェクト全体をチェックアウトしてください。http://www.assembla.com/code/rochdev-android/subversion/nodes/ExampleStrobe – rochdev

+0

私がそれをデバッグすると、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 OSでうまく再生されません。アプリケーションには、Androidサービスを使用する方が良いかもしれません。 http://developer.android.com/guide/topics/fundamentals/services.htmlを参照してください。

+0

問題が修正され、背景が白に設定されますが、それ以降は変更されません。 – Cistoran

+0

私はスタートを追加した後、バックグラウンドを白に変更し、強制的にクローズします。 – Cistoran

+0

ええ、私が言ったように、スレッドはAndroidで問題になる可能性があります。代わりにサービスを使用してみてください。 –

関連する問題