ProgressBar не отображает прогресс постепенно на заставке - PullRequest
3 голосов
/ 19 августа 2011

У меня есть заставка, которая длится 5 секунд, и я хочу представить прогресс, используя ProgressBar.

public class SplashActivity extends Activity {

    private static final long SPLASHTIME = 5000;
    private ProgressBar progressBar;

    @Override
    public void onCreate(Bundle icicle) {

        super.onCreate(icicle);
        setContentView(R.layout.splash);

        SplashHandler handlerSplash = new SplashHandler();
        progressBar = (ProgressBar) findViewById(R.id.progression);
        progressBar.setMax((int) ((SPLASHTIME) / 1000));
        progressBar.setProgress(0);
        Message msg = new Message();
        msg.what = 0;
        handlerSplash.sendMessageDelayed(msg, SPLASHTIME);


        ThreadProgressBar threadProgress = new ThreadProgressBar();
        threadProgress.start();


    }

    private class ThreadProgressBar extends Thread {
        ProgressBarHandler handlerProgress = new ProgressBarHandler();
        public void run() {
            try {

                while (progressBar.getProgress() <= progressBar.getMax()) {
                    Thread.sleep(1000);

                    handlerProgress.sendMessage(handlerProgress.obtainMessage());
                }
            } catch (java.lang.InterruptedException e) {

            }
        }
    }

        private class ProgressBarHandler extends Handler {

            public void handleMessage(Message msg) {
                progressBar
                        .incrementProgressBy((int) (SPLASHTIME / SPLASHTIME));
            }
        }

        private class SplashHandler extends Handler {

            public void handleMessage(Message msg) {
                switch (msg.what) {
                default:
                case 0:
                    super.handleMessage(msg);
                    // new ProgressBarIncrease().execute();
                    Intent intent = new Intent();
                    intent.setClass(SplashActivity.this, RdvTab.class);
                    startActivity(intent);

                }
            }
        }

Ответы [ 2 ]

1 голос
/ 19 августа 2011

Я полагаю, поскольку SplashActivity само по себе является действием, нормально блокировать пользовательский интерфейс, верно? AsyncTask иногда запускается не постепенно, если вы хотите, чтобы обновление отображалось плавно, как насчет перехода на рабочий Thread и Handlder.

  • Создать Handler inside SplashActivity
  • В главном потоке отображать прогрессбар или заставку или что угодно
  • При создании другого потока для запуска обратного отсчета раз в секунду sendEmptyMessage() до Handler. Через 5 секунд отправьте сообщение на Handler, чтобы закрыть диалоговое окно и всплеск, после чего рабочий Thread завершится.

ОБНОВЛЕНО: Извините за медленную обратную связь. Как насчет этого? Я еще не проверял, и это не лучшая реализация, вы можете использовать эту логику

public class SplashActivity extends Activity {

    private static final int SPLASHTIME = 5000;
    // u can change the value here for smoother effect
    private static final long UPDATEINTERVAL = 1000;
    private ProgressBar progressBar;

    @Override
    public void onCreate(Bundle icicle) {

        super.onCreate(icicle);
        setContentView(R.layout.splash);

        progressBar = (ProgressBar) findViewById(R.id.progression);

        new Thread(new Runnable(){
            @Override
            public void run(){
                 int progress = 0;
                 while(true){
                     // send current progress to handler
                     mHandler.sendEmptyMessage(progress);
                     // break from the loop after SPLASHSCREEN millis
                     if(progress > SPLASHSCREEN)
                         break;
                     // increase the progress
                     progress = (int) (progress + UPDATEINTERVAL);
                     // sleep the worker thread
                     Thread.sleep(UPDATEINTERVAL);
                 }
            }
        }).start();
    }

    private Handler mHandler = new Handler(){
         @Override
         public void handleMessage(Message message){
             // get the current progress
             int progress = message.what;
             if(progress <= SPLASHTIME){
                 progressBar.setProgress(progress);
             }
             else{
                 // finish splashActivity here & do what u want do to after splashscreen, for example
                 finish();
                 Intent intent = new Intent(SpashActivity.this, MenuActivity.class);
                 startActivity(intent);
             }
         }
     }
 }
0 голосов
/ 19 августа 2011

Вы должны разделить время экрана-заставки на равные суммы и отправить обновление прогресса с этими интервалами.
Например: допустим, общее время делится на 50 равных интервалов следующим образом

protected void onPreExecute() {
         progressbarStep = progressbarWidth/50;
         timeStep = 5000/50;
         progress = 0;

    }

    @Override
    protected Void doInBackground(Void... params) {
        try {
            while(progress < progressbarWidth){
                progress += progressbarStep;
                publishProgress(progress);
                SystemClock.sleep(timeStep);
               }
               return null;
        } catch (Exception e) {

        }
        return null;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
         progressBar.setProgress(values[0]);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...