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);
}
}
}
您应该将启动画面时间分成相等的数量,并按这些时间间隔发送进度更新。
例如:可以说总时间被分为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]);
}
感谢您的帮助,但我宁愿选择处理程序+线程的方法 – ulquiorra
我想,因为SplashActivity
本身的活性,这是确定到框UI正确? 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);
}
}
}
}
非常感谢,我遵循您的建议,现在它可以工作,但我不知道它是否干净:p。我会更新我的代码,请告诉我,如果是继续进行的好方法吗?谢谢 – ulquiorra
这很好,worker线程线程和处理程序将顺利显示进度。如果你不确定,随时发布,我会检查你的 –
你能描述这个流程应该如何工作吗?当'SplashHandler'接收到消息时,它会启动一个'AsyncTask'在后台运行,并将进度发送到'ProgressBar',然后开始一个'SplashActivity'的权利?这个逻辑对我来说看起来不太清楚 –
@romy_ngo我有一个充当splashactivity的活动。 它持续5秒,然后重定向到另一个活动,由于一个处理程序 我添加了一个进度条来显示加载时间(5秒)我把它填入asynchtask。但我不知道如何逐渐填充progressBar,它会在splashscreen结束时填充。感谢您的帮助 – ulquiorra