以下是一些代码:
public class ShowDialog extends Thread {
private static String mTitle="Please wait";
private static String mText="Loading...";
private Activity mActivity;
private ProgressDialog mDialog;
ShowDialog(Activity activity) {
this(activity, mTitle, mText);
}
ShowDialog(Activity activity, String title) {
this(activity, title, mText);
}
ShowDialog(Activity activity, String title, String text) {
super();
mText=text;
mTitle=title;
mActivity=activity;
if (mDialog == null) {
mDialog = new ProgressDialog(mActivity);
mDialog.setTitle(mTitle);
mDialog.setMessage(mText);
mDialog.setIndeterminate(true);
mDialog.setCancelable(true);
mDialog.setOnCancelListener(
new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface arg0) {
mDialog.dismiss();
interrupt();
}
});
}
}
public void run() {
mDialog.show();
while(!isInterrupted())
mDialog.dismiss();
mDialog=null;
}
}
在我的主要活动中:
ShowDialog show = new ShowDialog(this, "Please wait!","Loading badly...");
show.start();
SystemClock.sleep(2000);
show.interrupt();
我知道我可能会使用异步任务和所有东西,但这不是我想要的。用任何需要一些时间的东西替换SystemClock.sleep。我们的想法是在UI线程中执行start和interrupt之间的代码,并创建一个处理ProgressDialog的单独线程。 我的帖子出了什么问题?
非常感谢!
答案 0 :(得分:2)
要等待线程完成,您应该使用Thread.join()
方法。但现在我看到你不想等待它完成,但是你需要控制它什么时候完成。不过,您仍希望避免以这种方式中断线程。
在ShowDialog
课程中,添加dismiss()
方法,您可以从main
而不是interrupt()
拨打该方法。还要添加boolean dismiss = false
实例变量。在dismiss()
中,添加dismiss = true
,然后添加notify();
。在run()
中,使用while()
替换常量while(!dismiss){wait()}
循环(持续运行且非常低效)。您仍然需要添加同步块和异常处理,但这应该让您有一个良好的开端。
这是一个通用的Java(非机器人)简化示例:
public static class ShowDialog extends Thread{
protected boolean dismiss;
public void dismiss(){
dismiss = true;
synchronized(this){
notifyAll();
}
}
@Override
public void run(){
System.out.println("Running...");
// Show your dialog here.
while(!dismiss){
synchronized(this){
try{
wait();
}catch(InterruptedException ie){
ie.printStackTrace();
}
}
}
System.out.println("Quitting...");
// Dismiss your dialog here.
}
}
public static void main(String[] args) throws Exception{
ShowDialog sd = new ShowDialog();
sd.start();
Thread.sleep(2000);
sd.dismiss();
}
您提到您不想使用AsyncTask
,但我仍会重新考虑。 (你有什么理由反对它?)