Android 异步任务和进度条
我正在编写一个应用程序,其中我一个接一个地下载PDF并在视图中显示它们。 视图有一个“下一步”按钮,单击该按钮可显示PDF(在上一次单击时下载),并下载下一个PDF,再次单击“下一步”按钮时将显示该PDF。我正在使用异步任务下载文件。 对于每个文件,我有一个AsyncTask和一个ProgressDialog。 如果用户单击“下一步”按钮,并且要显示的文件(应该在上一次单击时下载)仍在下载,我希望显示progressbar并等待下载完成。以下是我的代码片段Android 异步任务和进度条,android,android-asynctask,android-progressbar,Android,Android Asynctask,Android Progressbar,我正在编写一个应用程序,其中我一个接一个地下载PDF并在视图中显示它们。 视图有一个“下一步”按钮,单击该按钮可显示PDF(在上一次单击时下载),并下载下一个PDF,再次单击“下一步”按钮时将显示该PDF。我正在使用异步任务下载文件。 对于每个文件,我有一个AsyncTask和一个ProgressDialog。 如果用户单击“下一步”按钮,并且要显示的文件(应该在上一次单击时下载)仍在下载,我希望显示progressbar并等待下载完成。以下是我的代码片段 public void saveFil
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();
}
[...]
}
这是我的异步任务代码
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]);
}
});
}
}
私有类下载程序扩展异步任务{
进程对话框;
@凌驾
受保护的void onPreExecute(){
//TODO自动生成的方法存根
super.onPreExecute();
mProgressDialog.setUndeterminate(false);
mProgressDialog.setMax(100);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_水平);
mProgressDialog.show();
}
@凌驾
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
已完成[fileNum]=真;
Log.e(“PDFReaderAct”,String.valueOf(fileNum)+“下载完成”);
mProgressDialog.disclose();
}
公共下载程序(){
[...]
mProgressDialog=newprogressdialog(PDFReaderAct.this);
[...]
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
尝试
{
//下载文件的代码
出版进度((整数)(总计*100/文件长度));
写入(字节,0,计数);
}
[...]
}
}
@凌驾
受保护的void onProgressUpdate(最终整数…进度){
super.onProgressUpdate(进度);
runOnUiThread(新的Runnable(){
公开募捐{
//TODO自动生成的方法存根
mProgressDialog.setProgress(progress[0]);
}
});
}
}
当我运行这段代码时,progressbar会出现,但是在showPdf()方法执行之后。我将跟踪每个文件下载的AsyncTasks和progressDialogs。如何显示上一次下载的进度
谢谢,这里
private void showPdf(){
[...]
downloaders.get(to_show).mProgressDialog.show(); //<<get method of AsyncTask
[...]
}
private void showPdf(){
[...]
downloaders.get(to_show).mProgressDialog.show();//此处
private void showPdf(){
[...]
downloaders.get(to_show).mProgressDialog.show();//明白了..我可以使用AsyncTask.get()使ui线程休眠方法,但我甚至想在此期间显示进度条..我可以这样做吗?@sampath:您有两个操作可以这样做:第一个操作是:在启动AsyncTask之前显示进度条,然后在onPostExecute方法中取消它。第二个操作是:在开始执行doInBackground之前使用onPreExecute显示进度条,就像您当前正在做的那样。是的..that显示下一个计划下载的进度。如果上一个仍在下载,我需要显示它的进度。谢谢,明白了。我可以使用AsyncTask.get()使ui线程休眠方法,但我甚至想在此期间显示进度条..我可以这样做吗?@sampath:您有两个操作可以这样做:第一个操作是:在启动AsyncTask之前显示进度条,然后在onPostExecute方法中取消它。第二个操作是:在开始执行doInBackground之前使用onPreExecute显示进度条,就像您当前正在做的那样。是的..that显示下一次计划下载的进度。如果上一次仍在下载,我需要显示其进度。谢谢,