【问题标题】:AsyncTask and ProgressbarAsyncTask 和进度条
【发布时间】:2012-12-17 04:58:02
【问题描述】:

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

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。如何显示上一次下载的进度..

谢谢,

【问题讨论】:

    标签: android android-asynctask android-progressbar


    【解决方案1】:

    这里

    private void showPdf(){
    
        [...]
    
         downloaders.get(to_show).mProgressDialog.show(); //<<get method of AsyncTask
    
        [...]
    }
    

    作为关于 AsyncTask. get (long timeout, TimeUnit unit) 的文档:

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

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

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

    【讨论】:

    • 知道了。我可以使用 AsyncTask.get() 方法使 ui 线程休眠,但我什至想在此期间显示进度条。我可以这样做吗?跨度>
    • @sampath :您有两个操作要做首先:在启动 AsyncTask 之前显示进度条并在 onPostExecute 方法中将其关闭。第二:使用 onPreExecute 在开始执行 doInBackground 之前显示进度条,就像您目前所做的那样。
    • 是的..显示下一个计划下载的进度..如果它仍在下载,我需要显示上一个的进度..谢谢,
    猜你喜欢
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多