Handler postDelayed - 每秒打印一次某些东西

5
我希望使用“handler”打印当前的秒数。我会录制一个确切的10秒视频,并想要每秒设置TextView的文本。
录制10秒的方法如下:
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
           stopRecordingVideo();
    }
}, 11000);  // don't know why 11000 but it only works this way

在10秒后,执行stopRecordingVideo()方法。那么我该如何每秒更改TextView的文本?
3个回答

7

工作答案:

int t = 0;
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        t++;
        textView.setText(getString(R.string.formatted_time, t));
        if(t<10) {
            handler.postDelayed(this, 1000);
        }
    }
}, 1000);

formatted_time 是类似这样的东西:

<string android:name="formatted_time">%d 秒</string>


(注意:本文中的 HTML 标签已保留)

2
我不得不将t声明为final int[],但在进行了这个更改后,它可以工作了。谢谢! - Roses

2

要每秒打印文本,您可以使用CountDownTimer。但是如果您想使用以下代码实现此目的:

void startTime(){
    //Post handler after 1 second.
    handler.postDelayed(runnable, 1000);
}

int totalDelay=0;
Handler handler = new Handler();
Runnable runnable = new Runnable() {
    @Override
    public void run() {
        totalDelay++;   
        if(totalDelay<=10){
            //If total time is less then 10 second execute handler again after 1 second
            handler.postDelayed(runnable, 1000);
        }
        textView.setText(totalDelay+" Second");
    }
};

为什么这里有一个startTime方法?我真的不需要它,对吧? - mafioso
但是在我的情况下,我应该什么时候调用StopRecordingVideo?就在这段代码下面吗? - mafioso
对我来说不起作用。 Variable 'runnable' initializer 'new Runnable() { @Override pu.." 是多余的,代码是灰色的。 - mafioso
将此代码放在类级别。不要将此代码放在方法内部。 - Dhaval Patel
在您的按钮点击事件中,只需放置“handler.postDelayed(runnable,1000);”即可。 - Dhaval Patel
显示剩余5条评论

1
尝试这个,基本上在工作线程中进行递增操作,但是更新文本视图是由主线程处理程序完成的。
 Thread worker= new Thread(new Runnable() {
         @Override
         public void run() {
            for (int i = 0; i < 10; i++) {
               try {
                  TimeUnit.SECONDS.sleep(1);
               } catch (InterruptedException e) {
                  e.printStackTrace();
               }
             // stop recording after 10 seconds
               if (i == 9) {

                  handler.post(new Runnable() {
                     @Override
                     public void run() {
                        stopRecordingVideo();
                     }
                  });
               }

              else{
                   // set text for each second
                  handler.post(new Runnable() {
                     @Override
                     public void run() {
                        textView.setText(String.valueOf(i+1));
                     }
                  });

               }
            }//ends for()

     worker.start()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接