使用线程在Android中显示进度对话框

时间:2011-12-24 15:01:50

标签: android multithreading progressdialog

以下是一些代码:

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的单独线程。 我的帖子出了什么问题?

非常感谢!

1 个答案:

答案 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,但我仍会重新考虑。 (你有什么理由反对它?)