Java ProgressBar没有';t在屏幕上逐渐显示进度

Java ProgressBar没有';t在屏幕上逐渐显示进度,java,android,progress-bar,Java,Android,Progress Bar,我有一个持续5秒的splashscreen,我想用ProgressBar来表示进度 public class SplashActivity extends Activity { private static final long SPLASHTIME = 5000; private ProgressBar progressBar; @Override public void onCreate(Bundle icicle) { super.on

我有一个持续5秒的splashscreen,我想用
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);

                }
            }
        }
公共类SplashActivity扩展活动{
私人静态最终长时间=5000;
私人ProgressBar ProgressBar;
@凌驾
创建公共空间(捆绑冰柱){
超级冰柱;
setContentView(R.layout.splash);
SplashHandler handlerSplash=新的SplashHandler();
progressBar=(progressBar)findViewById(R.id.progression);
progressBar.setMax((int)((SPLASHTIME)/1000));
progressBar.setProgress(0);
Message msg=新消息();
msg.what=0;
handlerSplash.sendMessageDelayed(消息,SPLASHTIME);
ThreadProgressBar ThreadProgressBar=新的ThreadProgressBar();
threadProgress.start();
}
私有类ThreadProgressBar扩展线程{
ProgressBarHandler handlerProgress=新的ProgressBarHandler();
公开募捐{
试一试{

while(progressBar.getProgress()您应该将启动屏幕的时间分成相等的数量,并在这些时间间隔发送进度更新。
例如:假设总时间被分成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]);
    }
受保护的void onPreExecute(){
progressbarStep=progressbarWidth/50;
时间步长=5000/50;
进度=0;
}
@凌驾
受保护的Void doInBackground(Void…参数){
试一试{
while(进度<进度宽度){
progress+=progressbarStep;
出版进度(progress);
系统时钟睡眠(时间步);
}
返回null;
}捕获(例外e){
}
返回null;
}
@凌驾
受保护的void onProgressUpdate(整型…值){
progressBar.setProgress(值[0]);
}

我想既然
SplashActivity
本身就是一个活动,那么就可以阻止UI了吧?
AsyncTask
有时不是逐渐运行的,如果你想让更新顺利显示,那么换成worker
Thread
handler
怎么样

  • 在SplashActivity中创建
    处理程序
  • 在主线程中,显示progressBar或splash或任何您喜欢的内容
  • 当让另一个线程运行倒计时时,每秒一次
    sendEmptyMessage()
    发送到
    Handler
    。5秒后,向
    Handler
    发送一条消息以关闭对话框,然后工作线程结束
更新:很抱歉反馈太慢。这个怎么样?我还没有测试它,而且它不是最好的实现,你可以使用这个逻辑

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);
             }
         }
     }
 }
公共类SplashActivity扩展活动{
专用静态最终时间=5000;
//u可以在此处更改值以获得更平滑的效果
私有静态最终长更新区间=1000;
私人ProgressBar ProgressBar;
@凌驾
创建公共空间(捆绑冰柱){
超级冰柱;
setContentView(R.layout.splash);
progressBar=(progressBar)findViewById(R.id.progression);
新线程(newrunnable()){
@凌驾
公开募捐{
int progress=0;
while(true){
//将当前进度发送给处理程序
mHandler.sendEmptyMessage(进度);
//在溅屏毫秒后从回路中断开
如果(进度>飞溅屏幕)
打破
//加快进度
进度=(int)(进度+更新间隔);
//让工作线程睡眠
sleep(UPDATEINTERVAL);
}
}
}).start();
}
私有处理程序mHandler=新处理程序(){
@凌驾
公共无效handleMessage(消息消息){
//获取当前进度
int progress=message.what;

如果(进度您能描述一下这个流程应该如何工作吗?当
SplashHandler
收到一条消息时,它会启动一个
AsyncTask
在后台运行,该任务会将进度发送到
ProgressBar
,然后它会启动一个
SplashActivity
对吗?这个逻辑看起来并不清楚me@romy_ngo我有一项活动ts作为一个splashactivity。它持续5秒,然后重定向到另一个活动。多亏了一个处理程序,我添加了一个进度条来显示加载时间(5秒)我在一个异步任务中填写了它。但是我不知道如何逐渐填充进度条,它在splashscreen的末尾填充。谢谢你的帮助。非常感谢,我按照你的建议,现在它工作了,但我不知道它是否干净:p。我将更新我的代码,你能告诉我这是一个好的方法吗?谢谢,很好,工人阅读线程和处理程序将顺利显示进度。如果您不确定,请随意发布,我将查看它以获得您的帮助,但我宁愿选择处理程序+线程的方法