在Android中每秒更新TextView

时间:2016-10-18 08:54:06

标签: android timer textview

我想每秒更新一次textview。 点击按钮我正在调用一种方法,

loopMethod(milli); //suppose milli= 50000 i.e 50 sec.

所以我的loopMethod(int m)如下:

public void loopMethod(int m){
    timer=(TextView) findViewById(R.id.timerText);
    if(m>=1000){
        try {
            timer.setText(""+m);//timer is a textview
            System.out.println(m);
            m=m-1000;
            Thread.sleep(1000);
        } catch(InterruptedException ex) {
            ex.printStackTrace();
        }
        loopMethod(m);
    }
}

所以我期待的是,我的计时器textview应该每秒打印m的值。 但我只得到控制台输出,即system.out.println(m) ... 控制台上的打印价值正常...... 但它根本没有更新我的textview

6 个答案:

答案 0 :(得分:11)

您可以使用以下代码:

Runnable updater;
void updateTime(final String timeString) {
    timer=(TextView) findViewById(R.id.timerText);
    final Handler timerHandler = new Handler();

    updater = new Runnable() {
        @Override
        public void run() {
            timer.setText(timeString);
            timerHandler.postDelayed(updater,1000);
        }
    };
    timerHandler.post(updater);
}

在这一行:

 timerHandler.post(updater);

时间将首次设定。即updater将执行。首次执行后,它将在每1秒的时间间隔后发布。它会每隔一秒更新一次TextView。

当活动破坏时你需要删除它,否则它会泄漏内存。

@Override
protected void onDestroy() {
   super.onDestroy();
   timerHandler.removeCallbacks(updater);
}

希望它会对你有所帮助。

答案 1 :(得分:2)

您应该使用RxJava库来执行此操作:

Subscription s =
                Observable.interval(1, TimeUnit.SECONDS)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(v -> {
                    // update your ui here
                }, e -> {

                });

        // call when you no longer need an update:
        if (s != null && !s.isUnsubscribed()){
            s.unsubscribe();
            s = null;
        }

就是这样。不要使用.postDelay(),Timer,因为它容易出错。

答案 2 :(得分:1)

您可能需要考虑使用Chronometer类:https://developer.android.com/reference/android/widget/Chronometer.html

只需点击按钮

即可使用timer.start();

答案 3 :(得分:0)

我添加了一些逻辑来停止Timer。如果您有任何问题,请自由询问

private int m = 0;
private int milliseconds = 1000;

public void loopMethod(int m){
  timer=(TextView) findViewById(R.id.timerText);
  Timer t = new Timer();

  //schedule a timer
  t.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {      
      runOnUiThread(new Runnable() {              
        @Override
        public void run() {
          timer.setText(String.valueOf(m));//avoid using composite string in the setText
          System.out.println(String.valueOf(m));

          //remove from the total the amount of millisecond passed
          m=m-milliseconds;
          if(m <= milliseconds) { //or <= what you want
            //stop the timer repeatitions
            t.cancel();
          }
        }
      });
    }
  //"0" is the amount of time to wait for the timer to start
  //"milliseconds" is the duration
  },0,milliseconds);
}

添加

要进行正确的分析,您应该在问题中添加更多信息。不更新textview的问题可能是由setText("" + int)引起的,因为使用int避免使用setText总是更好。我使用String.valueOf对其进行了编辑,但是如果它不起作用,则应添加xmlonCreate

希望这有帮助

答案 4 :(得分:0)

使用处理程序可以像这样使用

TextView timer;
    int m =0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        timer=(TextView) findViewById(R.id.timerText);
        Handler handler = new UpdateHandler();

        m = 10;
        handler.sendEmptyMessageDelayed(1, 1000);//start after 1000
    }


    class UpdateHandler extends Handler{
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
            case 1:
                timer=(TextView) findViewById(R.id.timerText);
                timer.setText("Text :" +m);
                m = m-1000;
                sendEmptyMessageDelayed(1, 1000); //seng again after 1000
                //add some stop logic
                break; 

            default:
                break;
            }

        }
    }

答案 5 :(得分:0)

尝试此代码在

中初始化textview
onCreate
   timer=(TextView) findViewById(R.id.timerText);


public void loopMethod(int m){

 if(m>=1000){
  try {

    System.out.println(m);
    m=m-1000;

    final ScheduledThreadPoolExecutor c = new ScheduledThreadPoolExecutor(1);
            c.schedule(new Runnable() {
                @Override
                public void run() {
                    timer.setText(""+m);//timer is a textview
                      c.shutdownNow();

                }
            }, 1, TimeUnit.SECONDS);





} catch(InterruptedException ex) {
    ex.printStackTrace();
}
loopMethod(m);
}
}