I made an application that at a certain time low PDFs, however I can only download a PDF. I wanted to download several PDFs, see the project. The part that is giving the error is in for
, where I try to call 3 times the part that reads the PDF. If I play only 1 string without for
it works. See:
Download class
public class AndroidFileDownloader extends Activity {
// Used to communicate state changes in the DownloaderThread
public static final int MESSAGE_DOWNLOAD_STARTED = 1000;
public static final int MESSAGE_DOWNLOAD_COMPLETE = 1001;
public static final int MESSAGE_UPDATE_PROGRESS_BAR = 1002;
public static final int MESSAGE_DOWNLOAD_CANCELED = 1003;
public static final int MESSAGE_CONNECTING_STARTED = 1004;
public static final int MESSAGE_ENCOUNTERED_ERROR = 1005;
// instance variables
private AndroidFileDownloader thisActivity;
private Thread downloaderThread;
private ProgressDialog progressDialog;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
thisActivity = this;
downloaderThread = null;
progressDialog = null;
//Cria o arquivo
File wallpaperDirectory = new File("/sdcard/Wallpaper/");
wallpaperDirectory.mkdirs();
File outputFile = new File(wallpaperDirectory, "/Wallpaper/");
try {
FileOutputStream fos = new FileOutputStream(outputFile);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String links[] = null;
links[0] = "http://lwn.net/images/pdf/20040806_novell_mtd.pdf";
links[1] = "http://lwn.net/images/pdf/IBM-155.pdf";
links[2] = "http://lwn.net/images/pdf/IBM-148.pdf";
for(int i =0; i <=links.length; i++){
downloaderThread = new DownloaderThread(thisActivity, links[i]);
downloaderThread.start();
}
}
/**
* This is the Handler for this activity. It will receive messages from the
* DownloaderThread and make the necessary updates to the UI.
*/
public Handler activityHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
/*
* Handling MESSAGE_UPDATE_PROGRESS_BAR: 1. Get the current
* progress, as indicated in the arg1 field of the Message. 2.
* Update the progress bar.
*/
case MESSAGE_UPDATE_PROGRESS_BAR:
if (progressDialog != null) {
int currentProgress = msg.arg1;
progressDialog.setProgress(currentProgress);
}
break;
/*
* Handling MESSAGE_CONNECTING_STARTED: 1. Get the URL of the file
* being downloaded. This is stored in the obj field of the Message.
* 2. Create an indeterminate progress bar. 3. Set the message that
* should be sent if user cancels. 4. Show the progress bar.
*/
case MESSAGE_CONNECTING_STARTED:
if (msg.obj != null && msg.obj instanceof String) {
String url = (String) msg.obj;
// truncate the url
if (url.length() > 16) {
String tUrl = url.substring(0, 15);
tUrl += "...";
url = tUrl;
}
String pdTitle = thisActivity
.getString(R.string.progress_dialog_title_connecting);
String pdMsg = thisActivity
.getString(R.string.progress_dialog_message_prefix_connecting);
pdMsg += " " + url;
dismissCurrentProgressDialog();
progressDialog = new ProgressDialog(thisActivity);
progressDialog.setTitle(pdTitle);
progressDialog.setMessage(pdMsg);
progressDialog
.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setIndeterminate(true);
// set the message to be sent when this dialog is canceled
Message newMsg = Message.obtain(this,
MESSAGE_DOWNLOAD_CANCELED);
progressDialog.setCancelMessage(newMsg);
progressDialog.show();
}
break;
/*
* Crie uma barra de progresso com
* Especificado valor máximo e atual valor 0; atribuí-la a
* ProgressDialog . O campo arg1 conterá o valor max . 2. Defina
* O título e um texto para a barra de progresso . O campo do obj
* Mensagem conterá uma String que representa o nome do
* Arquivo a ser baixado . 3. Defina a mensagem que deve ser enviada se
* Diálogo é cancelada. 4. Verifique a barra de progresso visível.
*/
case MESSAGE_DOWNLOAD_STARTED:
// obj will contain a String representing the file name
if (msg.obj != null && msg.obj instanceof String) {
int maxValue = msg.arg1;
String fileName = (String) msg.obj;
String pdTitle = thisActivity
.getString(R.string.progress_dialog_title_downloading);
String pdMsg = thisActivity
.getString(R.string.progress_dialog_message_prefix_downloading);
pdMsg += " " + fileName;
dismissCurrentProgressDialog();
progressDialog = new ProgressDialog(thisActivity);
progressDialog.setTitle(pdTitle);
progressDialog.setMessage(pdMsg);
progressDialog
.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setProgress(0);
progressDialog.setMax(maxValue);
// set the message to be sent when this dialog is canceled
Message newMsg = Message.obtain(this,
MESSAGE_DOWNLOAD_CANCELED);
progressDialog.setCancelMessage(newMsg);
progressDialog.setCancelable(true);
progressDialog.show();
}
break;
/*
* Handling MESSAGE_DOWNLOAD_COMPLETE: 1. Remove the progress bar
* from the screen. 2. Display Toast that says download is complete.
*/
case MESSAGE_DOWNLOAD_COMPLETE:
dismissCurrentProgressDialog();
displayMessage(getString(R.string.user_message_download_complete));
break;
/*
* Handling MESSAGE_DOWNLOAD_CANCELLED: 1. Interrupt the downloader
* thread. 2. Remove the progress bar from the screen. 3. Display
* Toast that says download is complete.
*/
case MESSAGE_DOWNLOAD_CANCELED:
if (downloaderThread != null) {
downloaderThread.interrupt();
}
dismissCurrentProgressDialog();
displayMessage(getString(R.string.user_message_download_canceled));
break;
/*
* Handling MESSAGE_ENCOUNTERED_ERROR: 1. Check the obj field of the
* message for the actual error message that will be displayed to
* the user. 2. Remove any progress bars from the screen. 3. Display
* a Toast with the error message.
*/
case MESSAGE_ENCOUNTERED_ERROR:
// obj will contain a string representing the error message
if (msg.obj != null && msg.obj instanceof String) {
String errorMessage = (String) msg.obj;
dismissCurrentProgressDialog();
displayMessage(errorMessage);
}
break;
default:
// nothing to do here
break;
}
}
};
/**
* If there is a progress dialog, dismiss it and set progressDialog to null.
*/
public void dismissCurrentProgressDialog() {
if (progressDialog != null) {
progressDialog.hide();
progressDialog.dismiss();
progressDialog = null;
}
}
/**
* Displays a message to the user, in the form of a Toast.
*
* @param message
* Message to be displayed.
*/
public void displayMessage(String message) {
if (message != null) {
Toast.makeText(thisActivity, message, Toast.LENGTH_SHORT).show();
}
}
public void openFolder() {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("Wallpaper/*");
startActivity(intent);
}
}
Thread Thread
public class DownloaderThread extends Thread {
// constants
private static final int DOWNLOAD_BUFFER_SIZE = 4096;
// instance variables
private AndroidFileDownloader parentActivity;
private String downloadUrl;
/**
* Instantiates a new DownloaderThread object.
*
* @param parentActivity
* Reference to AndroidFileDownloader activity.
* @param inUrl
* String representing the URL of the file to be downloaded.
*/
public DownloaderThread(AndroidFileDownloader inParentActivity, String inUrl) {
downloadUrl = "";
if (inUrl != null) {
downloadUrl = inUrl;
}
parentActivity = inParentActivity;
}
/**
* Connects to the URL of the file, begins the download, and notifies the
* AndroidFileDownloader activity of changes in state. Writes the file to
* the root of the SD card.
*/
@Override
public void run() {
URL url;
URLConnection conn;
int fileSize, lastSlash;
String fileName;
BufferedInputStream inStream;
BufferedOutputStream outStream;
File outFile;
FileOutputStream fileStream;
Message msg;
// we're going to connect now
msg = Message.obtain(parentActivity.activityHandler,
AndroidFileDownloader.MESSAGE_CONNECTING_STARTED, 0, 0,
downloadUrl);
parentActivity.activityHandler.sendMessage(msg);
try {
url = new URL(downloadUrl);
conn = url.openConnection();
conn.setUseCaches(false);
fileSize = conn.getContentLength();
// get the filename
lastSlash = url.toString().lastIndexOf('/');
fileName = "file.bin";
if (lastSlash >= 0) {
fileName = url.toString().substring(lastSlash + 1);
}
if (fileName.equals("")) {
fileName = "file.bin";
}
// notify download start
int fileSizeInKB = fileSize / 1024;
msg = Message.obtain(parentActivity.activityHandler,
AndroidFileDownloader.MESSAGE_DOWNLOAD_STARTED,
fileSizeInKB, 0, fileName);
parentActivity.activityHandler.sendMessage(msg);
// start download
inStream = new BufferedInputStream(conn.getInputStream());
outFile = new File(Environment.getExternalStorageDirectory() + "/Wallpaper/"
+ fileName);
fileStream = new FileOutputStream(outFile);
outStream = new BufferedOutputStream(fileStream,
DOWNLOAD_BUFFER_SIZE);
byte[] data = new byte[DOWNLOAD_BUFFER_SIZE];
int bytesRead = 0, totalRead = 0;
while (!isInterrupted()
&& (bytesRead = inStream.read(data, 0, data.length)) >= 0) {
outStream.write(data, 0, bytesRead);
// update progress bar
totalRead += bytesRead;
int totalReadInKB = totalRead / 1024;
msg = Message.obtain(parentActivity.activityHandler,
AndroidFileDownloader.MESSAGE_UPDATE_PROGRESS_BAR,
totalReadInKB, 0);
parentActivity.activityHandler.sendMessage(msg);
}
outStream.close();
fileStream.close();
inStream.close();
if (isInterrupted()) {
// the download was canceled, so let's delete the partially
// downloaded file
outFile.delete();
} else {
// notify completion
msg = Message.obtain(parentActivity.activityHandler,
AndroidFileDownloader.MESSAGE_DOWNLOAD_COMPLETE);
parentActivity.activityHandler.sendMessage(msg);
}
} catch (MalformedURLException e) {
String errMsg = parentActivity
.getString(R.string.error_message_bad_url);
msg = Message.obtain(parentActivity.activityHandler,
AndroidFileDownloader.MESSAGE_ENCOUNTERED_ERROR, 0, 0,
errMsg);
parentActivity.activityHandler.sendMessage(msg);
} catch (FileNotFoundException e) {
String errMsg = parentActivity
.getString(R.string.error_message_file_not_found);
msg = Message.obtain(parentActivity.activityHandler,
AndroidFileDownloader.MESSAGE_ENCOUNTERED_ERROR, 0, 0,
errMsg);
parentActivity.activityHandler.sendMessage(msg);
} catch (Exception e) {
String errMsg = parentActivity
.getString(R.string.error_message_general);
msg = Message.obtain(parentActivity.activityHandler,
AndroidFileDownloader.MESSAGE_ENCOUNTERED_ERROR, 0, 0,
errMsg);
parentActivity.activityHandler.sendMessage(msg);
}
}
}
Look at the code and see how I can download multiple PDFs.