Bootstrap Индикатор выполнения не увеличивается android - PullRequest
1 голос
/ 30 марта 2020

У меня есть следующий код, который я хотел бы использовать, чтобы медленно увеличивать индикатор выполнения в течение 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);
}

Моя проблема заключается в том, что это приводит только к 0% на loaderLabel и затем останавливается без выполнения что-нибудь. Ранее я пробовал этот код, но он только на 100% мигает на loaderLabel и заполняет индикатор выполнения, а затем переходит к следующему окну.

     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, то она замирает на нуле Что я могу делать не так?

Ответы [ 2 ]

2 голосов
/ 31 марта 2020

Исходя из ответа, данного Кумаром Харом sh, я бы посоветовал вам сделать следующее

 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 голосов
/ 30 марта 2020
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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...