From 491f2a2f5859923bd7ab530cc152303d5e7d35b3 Mon Sep 17 00:00:00 2001 From: Daniel Oeh Date: Thu, 29 Dec 2011 21:05:22 +0100 Subject: rewrote Downloading process --- src/de/podfetcher/service/DownloadService.java | 98 +++++++++++++++++++------- src/de/podfetcher/service/FeedSyncService.java | 1 + 2 files changed, 72 insertions(+), 27 deletions(-) (limited to 'src/de/podfetcher/service') diff --git a/src/de/podfetcher/service/DownloadService.java b/src/de/podfetcher/service/DownloadService.java index 34f992b74..871ca969d 100644 --- a/src/de/podfetcher/service/DownloadService.java +++ b/src/de/podfetcher/service/DownloadService.java @@ -7,6 +7,8 @@ package de.podfetcher.service; import java.io.File; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import de.podfetcher.feed.*; import de.podfetcher.storage.DownloadRequester; import android.app.Service; @@ -21,14 +23,19 @@ import android.util.Log; public class DownloadService extends Service { public static String ACTION_ALL_FEED_DOWNLOADS_COMPLETED = "action.de.podfetcher.storage.all_feed_downloads_completed"; - + public static final String ACTION_FEED_SYNC_COMPLETED = "action.de.podfetcher.service.feed_sync_completed"; + + private volatile ScheduledThreadPoolExecutor syncExecutor; private DownloadRequester requester; private FeedManager manager; @Override public void onCreate() { Log.d(this.toString(), "Service started"); - registerReceiver(receiver, createIntentFilter()); + registerReceiver(downloadReceiver, createIntentFilter()); + syncExecutor = new ScheduledThreadPoolExecutor(Runtime.getRuntime().availableProcessors() + 2); + manager = FeedManager.getInstance(); + requester = DownloadRequester.getInstance(); } @Override @@ -38,49 +45,62 @@ public class DownloadService extends Service { @Override public void onDestroy() { - unregisterReceiver(receiver); + Log.d(this.toString(), "Service shutting down"); + sendBroadcast(new Intent(ACTION_FEED_SYNC_COMPLETED)); } private IntentFilter createIntentFilter() { IntentFilter filter = new IntentFilter(); - filter.addAction(DownloadManager.ACTION_DOWNLOAD_COMPLETE); - return filter; } - private BroadcastReceiver receiver = new BroadcastReceiver() { + /** Shuts down Executor service and prepares for shutdown */ + private void initiateShutdown() { + Log.d(this.toString(), "Initiating shutdown"); + // Wait until PoolExecutor is done + Thread waiter = new Thread() { + @Override + public void run() { + syncExecutor.shutdown(); + try { + syncExecutor.awaitTermination(20, TimeUnit.SECONDS); + stopSelf(); + }catch(InterruptedException e) { + e.printStackTrace(); + } + } + }; + waiter.start(); + } + + private BroadcastReceiver downloadReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0); - requester = DownloadRequester.getInstance(); - manager = FeedManager.getInstance(); - Intent item_intent = requester.getItemIntent(id); - String action = item_intent.getAction(); - if(action.equals(DownloadRequester.ACTION_FEED_DOWNLOAD_COMPLETED)) { - handleCompletedFeedDownload(context, item_intent); - if(requester.getNumberOfFeedDownloads() == 0) { - sendBroadcast(new Intent(ACTION_ALL_FEED_DOWNLOADS_COMPLETED)); + long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0); + Feed feed = requester.getFeed(downloadId); + if(feed != null) { + handleCompletedFeedDownload(context, feed); + }else { + FeedImage image = requester.getFeedImage(downloadId); + if(image != null) { + handleCompletedImageDownload(context, image); } - } else if(action.equals(DownloadRequester.ACTION_MEDIA_DOWNLOAD_COMPLETED)) { - requester.removeMediaByID(item_intent.getLongExtra(DownloadRequester.EXTRA_ITEM_ID, -1)); - } else if(action.equals(DownloadRequester.ACTION_IMAGE_DOWNLOAD_COMPLETED)) { - handleCompletedImageDownload(context, item_intent); } // Check if there's something else to download, otherwise stop if(requester.getNumberOfDownloads() == 0) { - stopSelf(); + unregisterReceiver(downloadReceiver); + initiateShutdown(); } } }; /** Is called whenever a Feed is downloaded */ - private void handleCompletedFeedDownload(Context context, Intent intent) { - requester.removeFeedByID(intent.getLongExtra(DownloadRequester.EXTRA_ITEM_ID, -1)); + private void handleCompletedFeedDownload(Context context, Feed feed) { + requester.removeFeed(feed); // Get Feed Information - Feed feed = manager.getFeed(intent.getLongExtra(DownloadRequester.EXTRA_ITEM_ID, -1)); feed.setFile_url((new File(requester.getFeedfilePath(context), requester.getFeedfileName(feed.getId()))).toString()); // Update Information in Database manager.setFeed(context, feed); @@ -88,15 +108,39 @@ public class DownloadService extends Service { if(feed.getImage() != null) { requester.downloadImage(context, feed.getImage()); } - context.startService(intent); + syncExecutor.submit(new FeedSyncThread(feed, this)); } /** Is called whenever a Feed-Image is downloaded */ - private void handleCompletedImageDownload(Context context, Intent intent) { - requester.removeImageByID(intent.getLongExtra(DownloadRequester.EXTRA_ITEM_ID, -1)); - FeedImage image = manager.getFeedImage(intent.getLongExtra(DownloadRequester.EXTRA_ITEM_ID, -1)); + private void handleCompletedImageDownload(Context context, FeedImage image) { + requester.removeFeedImage(image); image.setFile_url(requester.getImagefilePath(context) + requester.getImagefileName(image.getId())); } + + /** Takes a single Feed, parses the corresponding file and refreshes information in the manager */ + class FeedSyncThread implements Runnable { + + private Feed feed; + private DownloadService service; + + public FeedSyncThread(Feed feed, DownloadService service) { + this.feed = feed; + this.service = service; + } + + public void run() { + FeedManager manager = FeedManager.getInstance(); + FeedHandler handler = new FeedHandler(); + + feed = handler.parseFeed(feed); + Log.d(this.toString(), feed.getTitle() + " parsed"); + // Add Feeditems to the database + for(FeedItem item : feed.getItems()) { + manager.addFeedItem(service, item); + } + } + + } } diff --git a/src/de/podfetcher/service/FeedSyncService.java b/src/de/podfetcher/service/FeedSyncService.java index c03e6ef69..7cb54d855 100644 --- a/src/de/podfetcher/service/FeedSyncService.java +++ b/src/de/podfetcher/service/FeedSyncService.java @@ -65,6 +65,7 @@ public class FeedSyncService extends Service { /** Prepares itself for stopping */ private void initiateShutdown() { + Log.d(this.toString(), "Initiating shutdown"); // Wait until PoolExecutor is done Thread waiter = new Thread() { @Override -- cgit v1.2.3