#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();