Android中的时间延迟

时间:2011-06-25 19:01:13

标签: android multithreading time sleep delay

所以我想在我的应用程序中创建一个“频闪”灯光效果。

要做到这一点,我需要一个时间延迟,一个是100毫秒,另一个是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编程,所以我不确定如何调用Thread Sleep。

3 个答案:

答案 0 :(得分: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"

答案 1 :(得分:1)

答案 2 :(得分: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