AsyncTask和Progressbar

时间:2012-12-17 04:58:02

标签: android android-asynctask android-progressbar

我正在编写一个应用程序,我逐个下载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。如何显示以前下载的进度..

谢谢,

1 个答案:

答案 0 :(得分: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方法返回结果

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