So I have an app which downloads certain files, dedicated to a client of mine who is hosting his files on a remote location, and i'm doing so using the code below:
public class DownloadService extends IntentService { private int result = Activity.RESULT_CANCELED; public DownloadService() { super("DownloadService"); } @Override protected void onHandleIntent(Intent intent) { String urlPath = intent.getStringExtra(URL); String fileName = intent.getStringExtra(FILENAME); File output = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), fileName); if (output.exists()) { output.delete(); } URLConnection streamConnection = null; InputStream stream = null; FileOutputStream fos = null; try { URL url = new URL(urlPath); streamConnection = url.openConnection(); stream = streamConnection.getInputStream(); streamConnection.connect(); long lengthofFile = streamConnection.getContentLength(); InputStream reader = stream; bis = new BufferedInputStream(reader); fos = new FileOutputStream(output.getPath()); int next = -1; int progress = 0; int bytesRead = 0; byte buffer[] = new byte[1024]; while ((bytesRead = bis.read(buffer)) > 0) { fos.write(buffer, 0, bytesRead); progress += bytesRead; int progressUpdate = (int)((progress * 100) / lengthofFile); Intent testIntent = new Intent(".MESSAGE_INTENT"); testIntent.putExtra(PERCENTAGE, progressUpdate); sendBroadcast(testIntent); } result = Activity.RESULT_OK; fos.flush(); } catch (Exception e) { e.printStackTrace(); } finally { if (stream != null) { try { stream.close(); bis.close(); } catch (IOException e) { e.printStackTrace(); } } if (fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } publishResults(output.getAbsolutePath(), result); } private void publishResults(String outputPath, int result) { Intent intent = new Intent(".MESSAGE_INTENT"); intent.putExtra(FILEPATH, outputPath); intent.putExtra(RESULT, result); sendBroadcast(intent); } } and to call this service i would use:
Intent intent = new Intent(MainActivity.getAppContext(), DownloadService.class); intent.putExtra(DownloadService.FILENAME, downloadFileName[item]); intent.putExtra(DownloadService.URL, urlDownload[item]); MainActivity.getAppContext().startService(intent); now this allows user to download one file at a time, however if the user downloads another file, the second file will have to wait till the first file is done downloading. now what is happening in my case is: 1- First download FILE_1 is downloading, and in the status is says FILE_1. 2- User clicks a new file download, the status changes the first file name to the second file name, and waits till FILE_1 finishes download to start with FILE_2 however the active download is changed from FILE_1 to FILE_2.
questions: is there a way to call DownloadService multiple times for multiple files? is it possible to fix the problem i'm facing? treating download intent services as two different intents?
UPDATE I managed to solve this issue by assigning a unique Int ID per file, each ID will point to a position in the listview which displays the files being downloaded or queued, then i work with each file on it's own.