【问题标题】:Bootstrap Progress bar not incrementing in androidBootstrap进度条在android中没有增加
【发布时间】:2020-03-30 14:26:56
【问题描述】:

我想使用以下代码将进度条缓慢增加 20 秒

    public void progressAnimator(){
    final long period = 1000;
    timer=new Timer();
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            //this repeats every 100 ms
            if (counter<100){
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        loaderLabel.setText(String.valueOf(counter)+"%");
                    }
                });
                mProgress.setProgress(counter);
                counter++;
            }
            else{
                //closing the timer
                timer.cancel();
                Intent intent =new Intent(SplashActivity.this,MainActivity.class);
                startActivity(intent);
                // close this activity
                finish();
            }
        }
    }, period);
}

我的问题是,这只会在 loaderLabel 上显示 0%,然后冻结而没有做任何事情。 我之前尝试过这段代码,但它只在 loaderLabel 上闪烁 100% 并填充进度条,然后进入下一个窗口。

     public void progressAnimator(){
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            for( counter =1; counter<=100; counter ++) {
                System.out.println(counter);
                mProgress.setProgress(counter);
                loaderLabel.setText(getResources().getString(R.string.loading) + " " + counter + " " + getResources().getString(R.string.percentSymbol));
                if (counter == 100) {
                    Toast.makeText(SplashActivity.this, R.string.welcome, Toast.LENGTH_LONG).show();
                    Intent loadMain = new Intent(SplashActivity.this, MainActivity.class);
                    startActivity(loadMain);
                    finish();
                }
            }
        }
    }, 100);

}

如果我将延迟增加到 20,000,然后它会冻结为零,我可能做错了什么?

【问题讨论】:

    标签: java android progress-bar android-bootstrap-widgets


    【解决方案1】:

    根据 Kumar Harsh 给出的答案,我建议您执行以下操作

     public void progressAnimator(){
        new CountDownTimer(total_duration, duration_of_one_step) {
            public void onTick(long millisUntilFinished) {
                // code to be executed on every iteration
                loaderLabel.setText(MessageFormat.format("{0} {1} {2}", getResources().getString(R.string.loading), ((total_duration - millisUntilFinished) / 1000) * 5, getResources().getString(R.string.percentSymbol)));
                mProgress.setProgress((int) ((total_duration - millisUntilFinished) / 1000)*5);
            }
            public void onFinish() {
                //code to be executed on completing the timer
                Toast.makeText(SplashActivity.this, R.string.welcome, Toast.LENGTH_LONG).show();
                Intent loadMain = new Intent(SplashActivity.this, MainActivity.class);
                startActivity(loadMain);
                finish();
            }
        }.start();
    }
    

    这应该可以解决您的问题注意,我乘以 5 以使进度达到 100,否则它将停止在 20

    【讨论】:

      【解决方案2】:
      public void progressAnimator(){
          final long period = 1000;
          timer=new Timer();
          new Handler().postDelayed(new Runnable() {
              @Override
              public void run() {
                  //this repeats every 100 ms
                  if (counter<100){
                      runOnUiThread(new Runnable() {
                          @Override
                          public void run() {
                              loaderLabel.setText(String.valueOf(counter)+"%");
                          }
                      });
                      mProgress.setProgress(counter);
                      counter++;
                  } else{
                      //closing the timer
                      timer.cancel();
                      Intent intent =new Intent(SplashActivity.this,MainActivity.class);
                      startActivity(intent);
                      // close this activity
                      finish();
                  }
              }
          }, period);
      }
      

      在您的第一个代码 sn-p 中,您已经实例化了一个 Timer 对象,但您还没有使用它来设置计时器。此外,在您的 Handler 实例中,没有循环可以确保 counter 不断增加。另外,如果有一个循环来增加counter,就像你之前的代码一样

      public void progressAnimator(){
          new Handler().postDelayed(new Runnable() {
              @Override
              public void run() {
                  for( counter =1; counter<=100; counter ++) {
                      System.out.println(counter);
                      mProgress.setProgress(counter);
                      loaderLabel.setText(getResources().getString(R.string.loading) + " " + counter + " " + getResources().getString(R.string.percentSymbol));
                      if (counter == 100) {
                          Toast.makeText(SplashActivity.this, R.string.welcome, Toast.LENGTH_LONG).show();
                          Intent loadMain = new Intent(SplashActivity.this, MainActivity.class);
                          startActivity(loadMain);
                          finish();
                      }
                  }
              }
          }, 100);
      }
      

      循环的整个 100 次迭代都在瞬间执行,因为没有 SLEEP 调用使循环实际等待 100 毫秒。您可以通过添加解决此问题 Thread.sleep(100) 在循环结束之前。但是,不建议这样做,因为它会导致整个 UI 线程被阻塞 100 毫秒。所以我建议你使用CountDownTimer 来解决这个问题。

      你可以这样使用它:

      new CountDownTimer(total_duration, duration_of_one_step) {
          public void onTick(long millisUntilFinished) {
              mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
              // Write code to be executed on every iteration here
          }
      
          public void onFinish() {
              mTextField.setText("done!");
              // Write code to be executed on completing the timer here
          }
      }.start();
      

      在您的情况下,total_duration = 20000 和 duration_of_one_step = 1000。

      【讨论】:

      • 您好,感谢您的评论,但只是一个简单的问题,您提供的代码是否替换了我的代码?如果是,我如何设置进度条的级别?
      • 不,它不会替换您的代码。您可以在 onTick 函数中插入进度条更新代码,因为您将在每次滴答时获得函数中的总持续时间和剩余时间,即每次调用时
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      相关资源
      最近更新 更多