在Android中显示ProgressBar一段时间
我必须在我的Android应用程序中等待几秒钟,我想在此期间显示一个进度条,我如何才能做到这一点 例如,我尝试了以下代码:在Android中显示ProgressBar一段时间,android,progress-bar,wait,Android,Progress Bar,Wait,我必须在我的Android应用程序中等待几秒钟,我想在此期间显示一个进度条,我如何才能做到这一点 例如,我尝试了以下代码: public boolean WaitTask() { pDialog = ProgressDialog.show(context,null, "Lädt..",true); new Thread() { public void run() { try{ //
public boolean WaitTask() {
pDialog = ProgressDialog.show(context,null, "Lädt..",true);
new Thread() {
public void run() {
try{
// just doing some long operation
sleep(2000);
} catch (Exception e) { }
pDialog.dismiss();
}
}.start();
return true;
}
但是progressbar会立即关闭,而无需等待两秒钟。我的问题在哪里
progressbar应该看起来像Android开发者在网站上展示的活动圈
更新
异步任务
private class WaitTime extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
mDialog.show();
}
protected void onPostExecute() {
mDialog.dismiss();
}
@Override
protected void onCancelled() {
mDialog.dismiss();
super.onCancelled();
}
@Override
protected Void doInBackground(Void... params) {
long delayInMillis = 2000;
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
mDialog.dismiss();
}
}, delayInMillis);
return null;
}
}
错误:调用
pDialog.discouse()代码>应该从UI线程执行,而不是从新线程调用
因此,您的代码应更改为:
pDialog = ProgressDialog.show(context,null, "Lädt..",true);
new Thread() {
public void run() {
try{
// just doing some long operation
Thread.sleep(2000);
} catch (Exception e) { }
// handle the exception somehow, or do nothing
}
// run code on the UI thread
mYourActivityContext.runOnUiThread(new Runnable() {
@Override
public void run() {
pDialog.dismiss();
}
});
}.start();
一般来说,有更好的方法来执行后台任务(等待两秒钟,什么也不做也是后台任务),并在完成后在主UI线程中执行某些操作。例如,您可以使用AsyncTask
类。最好使用这种android内置机制,而不是“原始”线程创建,尽管它也可以工作——只有在正确处理应用程序和活动生命周期的情况下。请记住,在您等待的两秒钟内,用户可能会离开您的应用程序。在这种情况下,disclose()代码>方法将在已破坏的上下文上调用
我建议您阅读更多-我建议您使用AsyncTask,然后您可以执行以下操作:
mDialog = new ProgressDialog(CreateProject.this);
mDialog = ProgressDialog.show(context,null, "Lädt..",true);
WaitTime wait = new WaitTime();
wait.execute();
AsyncTask<Void, Void, Void> updateTask = new AsyncTask<Void, Void, Void>(){
ProgressDialog dialog = new ProgressDialog(MyActivity.this);
@Override
protected void onPreExecute() {
// what to do before background task
dialog.setTitle("Loading...");
dialog.setMessage("Please wait.");
dialog.setIndeterminate(true);
dialog.setCancelable(false);
dialog.show();
}
@Override
protected Void doInBackground(Void... params) {
// do your background operation here
return null;
}
@Override
protected void onPostExecute(Void result) {
// what to do when background task is completed
dialog.dismiss();
};
@Override
protected void onCancelled() {
dialog.dismiss();
super.onCancelled();
}
};
updateTask.execute((Void[])null);
我尝试了前两种解决方案,但都没有成功。progressbar立即消失…根据您的asynctask更新:timer的计划任务在后台运行,因此在doInBackground中计划计时器后立即调用onPostExecute,因此对话框立即被取消,有关如何使用计时器处理对话框的示例,请参阅我的答案。您看到了catch()之后的{}?:-)如果我尝试运行您的代码,我会得到以下LogCat错误10-02 16:06:01.380:E/WindowManager(15154):Activity de.bertrandt.bertrandtknx.CreateProject泄漏了window com.android.internal.policy.impl.PhoneWindow$DecorView@41aa7f10最初添加到这里的是10-02 16:06:01.380:E/WindowManager(15154):android.view.WindowLeaked:Activity de.bertrandt.bertrandtknx.CreateProject已泄漏window com.android.internal.policy.impl.PhoneWindow$DecorView@41aa7f10这是最初添加到这里的
@Mojo先生:请阅读我在答案底部添加的内容。这正是我要警告你的..睡眠是在线程上下文中调用的,因此它是完全有效的。捕捉块位于释放之前。第三点是正确的,尽管handler.postDelayed不是一个糟糕的睡眠,顺便说一句?在我的主要帖子中添加了我的AsyncTask
,但它不起作用。ProgressBar在不等待2秒的情况下消失,与Tal KanelI的帖子中相同的LogCat错误可以解决LogCat中的错误,但ProgressBar仍然会立即消失……当您混合使用我的AcyncTask和计时器建议时,请尝试从onPostExecute中删除dialog.Disclose(),并让计时器将其解除。
final ProgressDialog dialog = new ProgressDialog(MyActivity.this);
dialog.setTitle("Loading...");
dialog.setMessage("Please wait.");
dialog.setIndeterminate(true);
dialog.setCancelable(false);
dialog.show();
long delayInMillis = 5000;
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
dialog.dismiss();
}
}, delayInMillis);