在android中运行线程时显示和关闭进度对话框

时间:2011-06-23 09:14:50

标签: android progressdialog

我的活动中有一个方法可以下载一组文件。这个下载是在我开始一项新活动时进行的。我已经使用了线程,因为它完全下载,而AsyncTask有时可能无法下载所有文件,它可能会陷入其间。

现在,下载时会显示黑屏。我想在ProgressDialog中显示它,以便用户可能会觉得某些内容正在下载。

我添加了一个ProgressDialog,但它没有显示。谁能告诉我哪里出错?

以下是我的代码:

我在onCreate()内写道:

downloadFiles();

private boolean downloadFiles() {
    showProgressDialog();
    for(int i = 0; i < filesList.size();i++) {
        Thread thread = new Thread(new Runnable() {    
            @Override
            public void run() {
                //downloading code
         });
         thread.start();
         thread.run();
    }
    dismissProgressDialog();
    return true;
}

//ProgressDialog progressDialog; I have declared earlier.
private void showProgressDialog() { 
    progressDialog = new ProgressDialog(N12ReadScreenActivity.this);
    progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    progressDialog.setMessage("Downloading files...");
    progressDialog.show();
}

private void dismissProgressDialog() {
    if(progressDialog != null)
        progressDialog.dismiss();
}

4 个答案:

答案 0 :(得分:1)

试试这个..它简单

ProgressDialog progress = new ProgressDialog(this);
progress.Indeterminate = true;
progress.SetProgressStyle(ProgressDialogStyle.Spinner);
progress.SetMessage("Downloading Files...");
progress.SetCancelable(false);

RunOnUiThread(() =>
{
    progress.Show();
});
Task.Run(()=>
//downloading code here...
).ContinueWith(Result=>RunOnUiThread(()=>progress.Hide()));

答案 1 :(得分:0)

请尝试以下代码。

private Handler responseHandler=null;
downloadFiles();

private boolean downloadFiles() {
    showProgressDialog();
    for(int i = 0; i < filesList.size();i++) {
        Thread thread = new Thread(new Runnable() {    
            @Override
            public void run() {
                //downloading code
                responseHandler.sendEmptyMessage(0);
         });
         thread.start();
    }

    responseHandler = new Handler() 
        {                               
            public void handleMessage(Message msg)  
            {
                super.handleMessage(msg);
                try 
                {
                    dismissProgressDialog() 
                } 
                catch (Exception e) 
                {
                    e.printStackTrace();
                }                       
            }
        };
}

在此代码中,当您的dowload将完成时,它将调用响应处理程序并且您的进度对话框将被解除。

答案 2 :(得分:0)

在downloadFiles()中显示对话框,然后启动一些线程,在它们启动后,对话框被解除。我不认为这是你想要的,因为对话框在最后一个线程启动后立即关闭,而不是在最后一个线程完成之后。

必须在最后一个线程完成其工作后调用dismissProgressDialog()方法。因此,在线程中运行的代码结束时,您必须检查其他线程是否仍在运行,或者是否可以忽略该对话框,因为没有其他线程正在运行。

答案 3 :(得分:0)

请尝试以下代码,让我知道它是怎么回事:

private Handler mHandler = new Handler(){
    public void handleMessage(Message msg)  
    {
        dismissProgressDialog() 
    }
};

private boolean downloadFiles() {
    showProgressDialog();
    for(int i = 0; i < filesList.size();i++) {
        Thread thread = new Thread(new Runnable() {    
            @Override
            public void run() {
                //downloading code
         });
         thread.start();
         thread.run();
    }
    mHandler.sendEmptyMessage(0);
    return true;
}

//ProgressDialog progressDialog; I have declared earlier.
private void showProgressDialog() { 
    progressDialog = new ProgressDialog(N12ReadScreenActivity.this);
    progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    progressDialog.setMessage("Downloading files...");
    progressDialog.show();
}

private void dismissProgressDialog() {
    if(progressDialog != null)
        progressDialog.dismiss();
}