我正在使用标准的ProgressDialog
实现:我设置了一个线程来运行一个长任务,当它完成时它会解除ProgressDialog。
@Override
public void onCreate( Bundle bundle ) {
super.onCreate( bundle );
context = this;
progress = ProgressDialog.show( this, "Running", "Please wait..", true, false);
progress.setOnDismissListener( new OnDismissListener() {
public void onDismiss(DialogInterface dialog) {
showResults();
}
});
new DeleteThread().start();
}
线程看起来像这样:
private class DeleteThread extends Thread {
public DeleteThread() {}
@Override
public void run() {
// long process during which we populate
// a LinearLayout with many other Views
progress.dismiss();
}
}
在showResults()
中,我们现在将LinearLayout填充为Views并将其设置为AlertDialog的内容。
问题是,ProgressDialog消失了,并且仍然有很长一段时间(10-12秒),在AlertDialog弹出之前没有任何事情发生。有没有办法立即实现这种转变?
答案 0 :(得分:1)
我知道这个答案可能会有点晚,但是到底是什么。
我看到你正在从onDismiss回调中触发showResults()方法。我建议你反过来做。为此,您可能需要使用AsyncTask类。
AsyncTask允许您轻松设置要在生成的线程中运行的任务,在需要时更新进度条(不是必需的,但在您的情况下可能会很好),当然还要在UI线程上运行一些代码一旦产生的线程完成。对于您的情况,我会将您的layoutview填充在AsyncTask.doInBackground()方法中。然后,您需要在AsyncTask.onPostExecute()中添加showResults()方法调用。在onPostExecute()的底部,您应该关闭进度对话框。那应该给你你想要的结果。
作为奖励,您可能希望为AsyncTask类创建构造函数,并在其中创建ProgressDialog。这样,ProgressDialog将完全封装在该类中,一切都很好,干净。所以,像这样:
class MyAsyncClass extends AsyncClass
{
ProgressDialog m_progress;
public MyAsyncClass()
{
m_progress = ProgressDialog.show( this, "Running", "Please wait..", true, false);
}
protected Long doInBackground(Object... data) {
// Do your long process of populating a LinearLayout with many other Views
}
protected void onPostExecute(Long result) {
showResults();
m_progress.dismiss();
}
}
注意:上面需要一些额外的参数给你,但你明白了。
答案 1 :(得分:0)
作为一名新手Android开发人员,我想冒昧地猜测,虽然为LinearLayout生成了指针,但布局本身还没有填充内容,因此当你调用progress.dismiss()时会填充它。
您可能必须在设置AlertDialogs内容之前渲染视图。 http://developer.android.com/guide/topics/ui/how-android-draws.html可能在这方面有一些帮助,不幸的是我的笔记本电脑有硬盘问题所以我没有安装Android开发环境,也无法尝试。但是我会在progress.dismiss()之前尝试使用LinearLayout上的无效,我希望有帮助:S
答案 2 :(得分:0)
使用下面的内容并使用AsyncTask,一旦完成就会解散对话:
final ProgressDialog progressDialog = new ProgressDialog(v.getContext());
progressDialog.setCancelable(false);
progressDialog.setMessage(v.getContext().getText(R.string.defaultQuantities));
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMax(100);
new CountDownTimer(250, 250) {
public void onTick(long millisUntilFinished) {
}
public void onFinish() {
if (progressDialog.getProgress() < 100) {
progressDialog.show();
}
}
}.start();