Как отобразить индикатор выполнения в течение 1 минуты?

#android

Вопрос:

У меня есть горизонтальный индикатор выполнения в Android. Мне нужно завершить его за 60 секунд.

Почему приведенный ниже код не работает?

 int progress = 0;
progressBarHorizontal.setMax(60);
while(progress < 60) {
     progressHandler.postDelayed((new Runnable() {
        public void run() {                     
           progressBarHorizontal.setProgress(progress);                    
        }                   
     }),progress * 1000);
     progress  ;
}
 

Пожалуйста, предложите некоторые другие методы. Я попробовал это:

 new Thread(new Runnable() {
                int progress = 0;       
                public void run() {
                    long timerEnd = System.currentTimeMillis()   60 * 1000;

                    while (timerEnd >  System.currentTimeMillis() ) {

                        progress = (int) (timerEnd - System.currentTimeMillis()) / 1000;
                        // Update the progress bar
                        progressHandler.post(new Runnable() {
                            public void run() {
                                progressBarHorizontal.setProgress(progress);
                            }
                        });                         
                        try {
                            Thread.sleep(500);
                        } catch (InterruptedException e) {
                            Log.w("tag","Progress thread cannot sleep");
                        }
                    }
                }
            }).start(); 
 

Но это тоже не работает.

Второй фрагмент кода действительно работает, проблема была в моей логике.

Комментарии:

1. Вы можете использовать AsynTask?

Ответ №1:

вы можете попробовать CountDownTimer :

 pd = ProgressDialog.show(MovementEntry.this, "", "Please Wait...",
                true, false);
pd.show();
new CountDownTimer(60000, 1000) {
  @Override
  public void onTick(long millisUntilFinished) {
      //this will be done every 1000 milliseconds ( 1 seconds )
      int progress = (60000 - millisUntilFinished) / 1000;
      pd.setProgress(progress);
  }

   @Override
   public void onFinish() {
      //the progressBar will be invisible after 60 000 miliseconds ( 1 minute)
      pd.dismiss();
   }

}.start();
 

Комментарии:

1. Обратный отсчет-хороший метод, но ProgressDialog скрывает мои обновления статуса ниже. Я попробую обратный отсчет, спасибо

2. Внутри пользовательского диалогового окна. заставил его работать, используя мой 2-й фрагмент кода, о котором идет речь. спасибо за помощь.. 🙂

3. приятно , так что примите ответ, который вы сочли полезным для себя

Ответ №2:

Это будет обновлять строку состояния до тех пор, пока она не достигнет своего максимального значения:

 private int progress = 0;
private final int pBarMax = 60;
 

 final ProgressBar pBar = (ProgressBar) findViewById(R.id.progressBar1);     
pBar.setMax(pBarMax);
final Thread pBarThread = new Thread() {
    @Override
    public void run() {
        try {
            while(progress<=pBarMax) {
                pBar.setProgress(progress);
                sleep(1000);
                  progress; 
            }
        }
        catch(InterruptedException e) {
        }
    }
};

pBarThread.start();
 

Комментарии:

1. по крайней мере, я не получаю никаких исключений при запуске этого.

Ответ №3:

Вы можете попробовать этот код для этого:

  Thread timer = new Thread(){
public void run(){
    try{
        sleep(10000);
        while(progressBarStatus < 10000){
            StartPoint.this.runOnUIThread(new Runnable(){
                public void run()
                {
                    progressBar.setProgress(progressBarStatus);
                    progressBarStatus  = 1000;
                }
            });

        }
    }catch(InterruptedException e){
        e.printStackTrace();
    }finally{

    }
}
};
timer.start();
 

Комментарии:

1. Мой индикатор выполнения находится внутри диалогового окна, в нем также есть обновления статуса, поэтому отображение этого будет скрывать обновления.

2. функция Thread.sleep() заблокирует его на 10 секунд , она не будет считать 10 секунд при удалении журнала прогресса

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

4. Заставил его работать, используя мой 2-й фрагмент кода, о котором идет речь. спасибо за помощь.. 🙂

Ответ №4:

Этот код работает для меня

 new Thread(new Runnable() {

                public void run() {
                    long timerEnd = System.currentTimeMillis()   60 * 1000;

                    while (timerEnd >  System.currentTimeMillis()) {

                        progress = 60 - (int) (timerEnd - System.currentTimeMillis()) / 1000;
                        // Update the progress bar

                        progressHandler.post(new Runnable() {
                            public void run() {                     
                                    progressBarHorizontal.setProgress(progress);                    
                            }                   
                        });

                        try {
                            Thread.sleep(500);
                        } catch (InterruptedException e) {
                            Log.w("App","Progress thread cannot sleep");
                        }
                    }
                    progressHandler.post(new Runnable() {
                        public void run() {                     
                                okButton.performClick();                    
                        }                   
                    });
                }
            }).start();