一个线程来显示Android的
进度对话框下面是代码的一些位:一个线程来显示Android的
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线程中执行开始和中断之间的代码,并创建一个独立的线程来处理ProgressDialog。 我的线程有什么问题?
非常感谢!
回答:
要等待线程完成,您应该使用Thread.join()
方法。但现在我看到你不想等待它完成,但是你需要控制它何时完成。尽管如此,你仍然希望避免以这种方式中断线程。
在你ShowDialog
类中,添加一个dismiss()
方法,你可以从你的main
调用,而不是interrupt()
。还要添加一个boolean dismiss = false
实例变量。在dismiss()
中,添加dismiss = true
,然后notify();
。在run()
中,用while(!dismiss){wait()}
替换常量while()
循环(不断运行,效率非常低)。您仍然需要添加同步块和异常处理,但这应该让您有一个良好的开端。
这里是一个通用的Java(非Android)简单例子:
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
,但我仍然会重新考虑。 (你有什么反对的理由?)
以上是 一个线程来显示Android的 的全部内容, 来源链接: utcz.com/qa/266544.html