2 znl 12 znl_12 于 2012.10.11 16:26 提问

Android中的时间延时问题

我想在应用程序中创建一个闪光点效果。为此我需要一个时间延迟,一个是100 ms,其它是20ms。这是我使用的代码:

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

问题是,当我单击按钮来调用该代码,没有出现所要的效果。所以我做了一点调试且确信它是定时调用。但是我不确定如何调用一个休眠线程。

3个回答

xiaoyan_12
xiaoyan_12   2012.10.11 17:26
已采纳

你应该使用Handler来实现

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"
csh_34
csh_34   2012.10.11 17:56

你的问题在于没有在线程里运行。为了在线程中运行代码,必须重写它的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();
ueryueryuery
ueryueryuery   2012.10.15 18:01

在非UI线程里不能直接操作UI,所以要使用Handler异步通知,没有放在run()方法里相信是LZ笔误。

znl_12
znl_12 你说的对,csh_34也提到这个问题。已经改正,谢谢!
5 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!