实时更新textView(使用for)

时间:2016-03-01 22:34:25

标签: java android for-loop android-studio

所以我有一个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当然)。我真的不确定这里的问题是什么。有人知道我做错了吗?

2 个答案:

答案 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循环。您需要为要进行的每个绘图向处理程序发送单独的消息。