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