1

我正在编写一个应用程序,我在其中一个一个下载 PDF 并在视图中显示它们。该视图有一个下一个按钮,onClick 显示 PDF(在上一次下一次单击时下载)并下载下一个 PDF,当再次单击下一个按钮时将显示下一个 PDF。我正在使用 AsyncTasks 下载文件。对于每个文件,我都有一个 AsyncTask 和一个 ProgressDialog。如果用户单击下一步按钮并且要显示的文件(应该在上一次单击时下载)仍在下载,我想显示进度条并等待下载完成。以下是我的代码片段..

public void saveFile(String uri, int index)
    {
if(!f.exists())
        {

            Downloader downloader = new Downloader(f, index);
            //adding the downloader to the list
             downloaders.add(downloader);
            downloader.execute(uri);
        }
}

这是我显示 PDF 的方法

private void showPdf(){

    [...]
          if(!completed[to_show]){

              downloaders.get(to_show).mProgressDialog.show();
              }
        [...]
}

这是我的 AsyncTask 代码

private class Downloader extends AsyncTask<String, Integer, String> {


    ProgressDialog mProgressDialog;

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        mProgressDialog.setIndeterminate(false);
        mProgressDialog.setMax(100);
        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        mProgressDialog.show();
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        completed[fileNum] = true;
        Log.e("PDFReaderAct",String.valueOf(fileNum)+" download complete");
        mProgressDialog.dismiss();
    }


    public Downloader() {
       [...]
        mProgressDialog = new ProgressDialog(PDFReaderAct.this);
       [...]
    }

@Override
protected String doInBackground(String...params ) {
            try
            {
                //Code to download the file
                    publishProgress((int) (total * 100 / fileLength));
                    os.write(bytes, 0, count);
                }
            [...]   
            }

            }

@Override
    protected void onProgressUpdate(final Integer... progress) {
        super.onProgressUpdate(progress);
        runOnUiThread( new Runnable() {

            public void run() {
                // TODO Auto-generated method stub
                mProgressDialog.setProgress(progress[0]);
            }
        });

    }

    }

当我运行此代码时,会显示进度条,但在执行 showPdf() 方法之后。我正在跟踪每个文件下载的 AsyncTasks 和 progressDialogs。我怎样才能显示以前下载的进度..

谢谢,

4

1 回答 1

1

这里

private void showPdf(){

    [...]

     downloaders.get(to_show).mProgressDialog.show(); //<<get method of AsyncTask

    [...]
}

作为关于AsyncTask 的文档。获取(长时间超时,TimeUnit 单位)

如有必要,最多等待给定时间以完成计算,然后检索其结果。

意味着如果您使用此方法从 AsyncTask 将结果返回到您的 UI 主线程,那么它将停止您的主 UI 执行,直到结果未从 AsyncTask 的 doInBackground 方法返回

解决方案onPostExecute用于在 AsyncTask 执行完成时更新 UI 元素

于 2012-12-17T05:03:04.293 回答