gpt4 book ai didi

android - AsyncTask 和 Progressbar

转载 作者:行者123 更新时间:2023-11-30 03:52:44 24 4
gpt4 key购买 nike

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

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

谢谢,

最佳答案

这里

private void showPdf(){

[...]

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

[...]
}

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

Waits if necessary for at most the given time for the computation to complete, and then retrieves its result.

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

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

关于android - AsyncTask 和 Progressbar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13908485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com