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);
}
В своем первом фрагменте кода вы создали экземпляр объекта Timer
, но не использовали его для установки таймера. Кроме того, в вашем экземпляре Handler
нет l oop, который может гарантировать постоянное увеличение counter
. Кроме того, если было oop для увеличения 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 итераций вашего l oop выполняются в fla sh поскольку вызова SLEEP
нет, чтобы l oop действительно ожидал 100 мс. Вы можете решить эту проблему, добавив Thread.sleep(100)
до конца l oop. Однако это не рекомендуется, поскольку это приведет к блокировке всего потока пользовательского интерфейса на 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.