ProgressBar在启动画面上不会逐渐显示进度

问题描述:

我有一个持续5秒的启动画面,我想用ProgressBar来表示进度。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); 

       } 
      } 
     } 
+0

你能描述这个流程应该如何工作吗?当'SplashHandler'接收到消息时,它会启动一个'AsyncTask'在后台运行,并将进度发送到'ProgressBar',然后开始一个'SplashActivity'的权利?这个逻辑对我来说看起来不太清楚 –

+0

@romy_ngo我有一个充当splashactivity的活动。 它持续5秒,然后重定向到另一个活动,由于一个处理程序 我添加了一个进度条来显示加载时间(5秒)我把它填入asynchtask。但我不知道如何逐渐填充progressBar,它会在splashscreen结束时填充。感谢您的帮助 – ulquiorra

您应该将启动画面时间分成相等的数量,并按这些时间间隔发送进度更新。
例如:可以说总时间被分为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]); 
    } 
+0

感谢您的帮助,但我宁愿选择处理程序+线程的方法 – ulquiorra

我想,因为SplashActivity本身的活性,这是确定到框UI正确? AsyncTask有时候不会逐渐运行,如果要更新顺利显示,请更改为工作人员ThreadHandlder

  • 创建Handlerinside 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

非常感谢,我遵循您的建议,现在它可以工作,但我不知道它是否干净:p。我会更新我的代码,请告诉我,如果是继续进行的好方法吗?谢谢 – ulquiorra

+0

这很好,worker线程线程和处理程序将顺利显示进度。如果你不确定,随时发布,我会检查你的 –