所以我有一个Android应用程序,我想减少一个值并在textview中显示它。我从1000开始,从1减1到1秒。如果您在关卡中保持更高水平,这将作为一个得分随时间减少。这是我的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.game);
timeText = (TextView) findViewById(R.id.textView5);
runOnUiThread(new Runnable() {
@Override
public void run() {
for(time=1000;time>=0;time--){
try {
TimeUnit.SECONDS.sleep(1);
timeText.setText(String.valueOf(time));
System.out.println(time);
}
catch(Exception e)
{
System.out.println("Error on delay");
}
}}
});
}
我的错误是每当我进入此活动时,屏幕变黑。控制台正在打印从秒到秒的值,如果我评论"对于" textView正确显示值1000(如果我声明int time = 1000当然)。我真的不确定这里的问题是什么。有人知道我做错了吗?
答案 0 :(得分:1)
您正在暂停该for循环中的UI。
要实现您的目标,请使用Handler
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//update textview here
}
},1000);
OR
使用Timer
new Timer().scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
//update
}
},1000,0);
我对处理程序了解不多,但你不需要在计时器中使用for循环。
在你的情况下:
long time=1000;
new Timer().scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable(){
timeText.setText(String.valueOf(time))
time--;
});
}
},1000,0).start();
祝你好运
答案 1 :(得分:0)
你不能像这样循环UI线程。在Android内部,UI线程上有一个消息循环。当需要绘制时,它会向该消息循环发送一条消息。在您处理该消息之前,更改不会显示在屏幕上。要处理消息,您的代码必须完成并返回消息循环。
如果要执行此操作,则无法在UI线程上使用for循环。您需要为要进行的每个绘图向处理程序发送单独的消息。