ProgressDialog不会显示 - 多线程

时间:2014-05-28 07:24:48

标签: java android multithreading progressdialog

我正在尝试在主线程中启动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至少提及原因。没有理由,人们无法知道问题中遗漏了什么。

2 个答案:

答案 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();

看看这个......