【问题标题】:show and dismiss progress dialog while running a thread in android在android中运行线程时显示和关闭进度对话框
【发布时间】:2011-06-23 09:14:50
【问题描述】:

我的活动中有一个下载一组文件的方法。当我开始一项新活动时,将进行此下载。我使用了线程,因为它会完全下载,而 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();
}

【问题讨论】:

  • 也许这不能解决问题,但你为什么要调用thread.run()?您只需调用 thread.start() 即可创建线程。我一直在使用 AsyncTask 下载多个文件,使用它从来没有遇到任何问题,更新 UI 线程也不是一项艰巨的任务。

标签: android progressdialog


【解决方案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()));

【讨论】:

    【解决方案2】:

    请尝试下面的代码。

    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();
                    }                       
                }
            };
    }
    

    在此代码中,当您的下载完成时,它称为响应处理程序,您的进度对话框将关闭。

    【讨论】:

    • 如果我错了,请纠正我,但这将在第一个线程完成后关闭对话框。
    • 是的,它在第一个线程完成后关闭对话框。你必须修改你的代码,就像它会再次调用你的函数一样......
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      试试下面的代码,告诉我结果如何:

      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();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多