I'm trying to download multiple files one by one (file is downloaded, we start downloading the next file). Using this method I can keep track of the files 开发者_Python百科being downloaded. The problem is that I'm using the following code for executing a Task:
File file = null;
for(int i=0; i< videos.length; i++) {
file = new File(root.getPath() + videos[i]);
boolean exists = file.exists();
if(exists){
//tv.append("\n\n"+fileNames[i]+" already exists");
continue;
}
else {
currentFile = videos[i];
new DownloadFileAsync().execute(videoURL+videos[i],videos[i]);
}
file = null;
}
As you can see, I call new DownloadFileAsync().execute(videoURL+videos[i],videos[i]); in a loop which obviously start a task for each of the files and downloads them simultaneously.
My question is: How can I run execute the task for a specific file, check if it has been downloaded- if yes, proceed with next file by executing a task for it?
package com.example.androidhive;
import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
public class AndroidDownloadFileByProgressBarActivity extends Activity {
// button to show progress dialog
Button btnShowProgress;
// Progress Dialog
private ProgressDialog pDialog;
ImageView my_image;
// Progress dialog type (0 - for Horizontal progress bar)
public static final int progress_bar_type = 0;
// File url to download
String[] ur = {
"http://www.funrocker.com/blog/wp-content/uploads/2010/04/Animals-Wild-Life-Jungle-FunRocker.Com-03.jpg",
"http://2.bp.blogspot.com/-j56yaqpfjVE/TnzTjcqnCjI/AAAAAAAAGPM/MzqmczFkC30/s1600/natural-pictures.jpg",
"http://www.fantasy-and-art.com/wp-content/gallery/nature-wallpapers/red-tree-wallpaper-hd.jpg" };
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// show progress bar button
btnShowProgress = (Button) findViewById(R.id.btnProgressBar);
// Image view to show image after downloading
my_image = (ImageView) findViewById(R.id.my_image);
/**
* Show Progress bar click event
* */
btnShowProgress.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// starting new Async Task
new DownloadFileFromURL().execute(ur);
}
});
}
/**
* Showing Dialog
* */
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case progress_bar_type:
pDialog = new ProgressDialog(this);
pDialog.setMessage("Downloading file. Please wait...");
pDialog.setIndeterminate(false);
pDialog.setMax(100);
pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pDialog.setCancelable(true);
pDialog.show();
return pDialog;
default:
return null;
}
}
/**
* Background Async Task to download file
* */
class DownloadFileFromURL extends AsyncTask<String, Integer, String> {
/**
* Before starting background thread Show Progress Bar Dialog
* */
@Override
protected void onPreExecute() {
super.onPreExecute();
showDialog(progress_bar_type);
}
/**
* Downloading file in background thread
* */
@Override
protected String doInBackground(String... f_url) {
int count;
try {
for (int i = 0; i < f_url.length; i++) {
URL url = new URL(f_url[i]);
URLConnection conection = url.openConnection();
conection.connect();
// getting file length
int lenghtOfFile = conection.getContentLength();
// input stream to read file - with 8k buffer
InputStream input = new BufferedInputStream(
url.openStream(), 8192);
System.out.println("Data::" + f_url[i]);
// Output stream to write file
OutputStream output = new FileOutputStream(
"/sdcard/downloaded" + i + ".jpg");
byte data[] = new byte[1024];
long total = 0;
while ((count = input.read(data)) != -1) {
total += count;
// publishing the progress....
// After this onProgressUpdate will be called
publishProgress((int) ((total * 100)/lenghtOfFile));
// writing data to file
output.write(data, 0, count);
}
// flushing output
output.flush();
// closing streams
output.close();
input.close();
}
} catch (Exception e) {
Log.e("Error: ", e.getMessage());
}
return null;
}
/**
* Updating progress bar
* */
protected void onProgressUpdate(Integer... progress) {
// setting progress percentage
pDialog.setProgress(progress[0]);
}
/**
* After completing background task Dismiss the progress dialog
* **/
@Override
protected void onPostExecute(String file_url) {
// dismiss the dialog after the file was downloaded
dismissDialog(progress_bar_type);
// Displaying downloaded image into image view
// Reading image path from sdcard
String imagePath = Environment.getExternalStorageDirectory()
.toString() + "/downloaded.jpg";
// setting downloaded into image view
// my_image.setImageDrawable(Drawable.createFromPath(imagePath));
}
}
}
If I understand correctly, you do not want to download all the files at the same tim e(simultaneously) but one by one (serially).
In order to do so build a String array with the URLs to download, and call execute()
with that array.
Example: Assuming that your
DownloadFileAsync
expects String as a parameter to it'sdoInBackground method
, you would call to:
new DownloadFileAsync().execute(url1, url2, url3, url4, video1, video2, video3, video4);
package com.ProgressDialogDemo1;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
public class ProgressDialogDemoActivity extends Activity {
public static final int DIALOG_DOWNLOAD_PROGRESS = 0;
private Button startBtn;
private ProgressDialog mProgressDialog;
ProgressBar prgBar1;
ImageView imgv1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imgv1 = (ImageView) findViewById(R.id.imgv1);
startBtn = (Button)findViewById(R.id.startBtn);
prgBar1 = (ProgressBar) findViewById(R.id.prgBar1);
prgBar1.setMax(100);
startBtn.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
startDownload();
}
});
}
private void startDownload() {
String[] url = {"http://animal.discovery.com/birds/peacock/pictures/peacock-picture.jpg",
"http://www.funrocker.com/blog/wp-content/uploads/2010/04/Animals-Wild-Life-Jungle-FunRocker.Com-03.jpg",
"http://www.thewallpapers.org/photo/5790/Nature_Wallpapers-037.jpg",
"http://2.bp.blogspot.com/-j56yaqpfjVE/TnzTjcqnCjI/AAAAAAAAGPM/MzqmczFkC30/s1600/natural-pictures.jpg",
"http://www.fantasy-and-art.com/wp-content/gallery/nature-wallpapers/red-tree-wallpaper-hd.jpg",
"http://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Bachalpseeflowers.jpg/300px-Bachalpseeflowers.jpg"};
DownloadFileAsync dloadFAsync = new DownloadFileAsync(url);
dloadFAsync.execute(url);
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DIALOG_DOWNLOAD_PROGRESS:
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setCancelable(false);
return mProgressDialog;
default:
return null;
}
}
// Async Task
class DownloadFileAsync extends AsyncTask<String, String, String> {
int current=0;
String[] paths;
String fpath;
boolean show = false;
public DownloadFileAsync(String[] paths) {
super();
this.paths = paths;
for(int i=0; i<paths.length; i++)
System.out.println((i+1)+": "+paths[i]);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... aurl) {
int rows = aurl.length;
while(current < rows)
{
int count;
try {
System.out.println("Current: "+current+"\t\tRows: "+rows);
fpath = getFileName(this.paths[current]);
URL url = new URL(this.paths[current]);
URLConnection conexion = url.openConnection();
conexion.connect();
int lenghtOfFile = conexion.getContentLength();
InputStream input = new BufferedInputStream(url.openStream(), 512);
OutputStream output = new FileOutputStream("/sdcard/"+fpath);
byte data[] = new byte[512];
long total = 0;
while ((count = input.read(data)) != -1) {
total += count;
publishProgress(""+(int)((total*100)/lenghtOfFile));
output.write(data, 0, count);
}
show = true;
output.flush();
output.close();
input.close();
current++;
} catch (Exception e) {}
} // while end
return null;
}
@Override
protected void onProgressUpdate(String... progress) {
prgBar1.setProgress(Integer.parseInt(progress[0]));
if(show) {
File dir = Environment.getExternalStorageDirectory();
File imgFile = new File(dir, getFileName(this.paths[(current-1)]));
Bitmap bmp = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
imgv1.setImageBitmap(bmp);
show = false;
}
}
@Override
protected void onPostExecute(String unused) {
System.out.println("unused: "+unused);
}
}
public String getFileName(String wholePath)
{
String name=null;
int start,end;
start=wholePath.lastIndexOf('/');
end=wholePath.length(); //lastIndexOf('.');
name=wholePath.substring((start+1),end);
name = "images/"+name;
System.out.println("Start:"+start+"\t\tEnd:"+end+"\t\tName:"+name);
return name;
}
}
精彩评论