Индикатор выполнения не обновляет строку прогресса после определенного интервала - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть таймер около 3 минут, и я добавил progress bar, который добавляет 1 пункт в индикатор выполнения после каждого 1860 milliseconds.

Так что после 1860000 миллисекунд он завершает процесс.

Проблема в том, что при запуске он заполняет индикатор выполнения и не отображает анимацию загрузки.

Это мой код.

 countDownTimer=new CountDownTimer(186000, 1860) {

            public void onTick(long millisUntilFinished) {

                progressBar.setProgress(time+=1);
                Log.d("seconds remaining: ", String.valueOf(time));
            }

            public void onFinish() {
                finish();
                time=0;
            }
        }.start();

    }

Макетfile

<ProgressBar
    android:id="@+id/progressBar"
    style="@style/Widget.AppCompat.ProgressBar.Horizontal"
    android:layout_width="0dp"
    android:layout_height="4dp"
    android:layout_marginTop="30dp"
    android:max="100"
    android:progressDrawable="@drawable/progressbar_background"
    app:layout_constraintEnd_toStartOf="@+id/guideline9"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="@+id/guideline10"
    app:layout_constraintTop_toBottomOf="@+id/imageView19" />

Если я удаляю метод progressDialog.setProgress(), он показывает пустой индикатор выполнения, и если я добавляю эту строку, progress bar автоматически заполняется при запуске.

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018

Мне кажется, проблема в том, что вы используете переменную time, которая объявлена ​​и инициализирована вне области действия анонимного класса CountDownTimer.Вы можете проверить, имеет ли time правильное значение внутри CountDownTimer, запустив его в режиме отладки или просто выполнив System.out.printnln(time) перед вызовом setProgress.

Чтобы убедиться, что значение, которое вы устанавливаете в индикаторе выполнения, является правильным, просто сделайте следующее:

progressBar.setProgress(100 - millisUntilFinished *100 /186000)

0 голосов
/ 27 ноября 2018

Для этой цели вы можете использовать асинхронную задачу, код выглядит примерно так:

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ProgressBar;

public class MainActivity extends AppCompatActivity {

    private ProgressBar progressBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        progressBar = findViewById(R.id.progressBar);

        LongTask timer = new LongTask();
        timer.execute();
    }

    private class LongTask extends AsyncTask<Void, Integer, Void> {

        private static final int INTERVAL = 1860;

        @Override
        protected Void doInBackground(Void... params) {
            for (int i = 0; i <= 100; i++) {
                publishProgress(i);
                try {
                    Thread.sleep(INTERVAL);
                } catch (InterruptedException e) {
                    Thread.interrupted();
                }

                Log.d("Milliseconds elapsed: %s", String.valueOf(i * INTERVAL));
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {}

        @Override
        protected void onPreExecute() {}

        @Override
        protected void onProgressUpdate(Integer... values) {
            int progress = values[0];
            progressBar.setProgress(progress);
        }
    }
}
0 голосов
/ 26 ноября 2018

Вы должны установить индикатор выполнения с помощью:

<ProgressBar
    ...
    android:max="1860000"
    />

Затем onTick (), вызов:

progressBar.setProgress(time+=1860);
...