我正在尝试在主线程中启动ProgressDialog但它根本不显示。流程是这样的,我在主线程中启动ProgressDialog,然后启动一个执行某些操作的线程。操作完成后,ProgressDialog将被解除。
我的代码如下:
主要课程:
final ProgressDialog ringProgressDialog = ProgressDialog.show(someclass.this, "Please wait ...", "Configuring...", true);
ringProgressDialog.setCancelable(true);
spinnerThread t = new spinnerThread(this, ringProgressDialog);
t.start(); //Dialog won't show
try {
t.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Intent i = new Intent("org.CameraDemo"); //Activity won't start and the app itself closes
i.addFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION);
finish();
主题类:
class spinnerThread extends Thread {
ProgressDialog progress;
someclass someobject;
public spinnerThread(someclass someobject,
ProgressDialog progress) {
super();
this.someobject= someobject;
this.progress = progress;
}
@Override
public void run() {
someobject.action1();
someobject.action2();
someobject.action3();
progress.dismiss();
}
}
要求downvoters至少提及原因。没有理由,人们无法知道问题中遗漏了什么。
答案 0 :(得分:1)
您在创建并启动的spinnerthread上调用join()
,这将阻止UI线程,直到spinnetraread完成其工作。该对话框不会出现,因为尽管您在活动中正确创建并初始化它,但在主UI线程等待的spinnerthread中将其关闭,然后再执行其他操作(如实际显示对话框)。
如果您在开始新活动之前尝试做一些非常重要的工作(可能会导致ANR),我建议您使用AsyncTask
,因为它的功能比简单的线程。您将初始化并在ProgressDialog
回调中显示onPreExecute()
,在doInBackground()
回调中执行工作,然后解除对话框并在onPostExecute()
回调中启动新活动。
您仍然可以使用普通线索,但是您需要删除join()
来电,然后在spinnerthread的run()
方法结束时启动新活动。
答案 1 :(得分:0)
public void showCancelableProgressDialog(String title, String message, int pbarstyle, String cancelLabel, OnClickListener cancelListener) {
dialog = new ProgressDialog(context);
dialog.setTitle(title);
dialog.setMessage(message);
dialog.setIndeterminate(true); //if you are not showing proper progress
dialog.setProgressStyle(pbarstyle); //the style you want like horizontal progress bar or spinner type
dialog.setCancelable(true);
dialog.setMax(100);
dialog.setButton(DialogInterface.BUTTON_NEGATIVE, cancelLabel, cancelListener);
dialog.show();
}
在调用此方法时,您可以这样做
Thread th = new Thread(){
@Override
public void run (){
showCancelableProgressDialog(your title, your message, ProgressDialog.STYLE_HORIZONTAL, activity.getResources().getString(R.string.cancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// handle what your cancel button needs to do
}
});
}
}
th.start();
看看这个......