问题描述
- 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(); } }
问题是,当我单击按钮来调用该代码,没有出现所要的效果。所以我做了一点调试且确信它是定时调用。但是我不确定如何调用一个休眠线程。
解决方案
你应该使用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"
解决方案二:
你的问题在于没有在线程里运行。为了在线程中运行代码,必须重写它的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();
解决方案三:
在非UI线程里不能直接操作UI,所以要使用Handler异步通知,没有放在run()方法里相信是LZ笔误。
时间: 2025-01-26 11:48:35