diff options
author | daniel oeh <daniel.oeh@gmail.com> | 2012-07-14 13:54:09 +0200 |
---|---|---|
committer | daniel oeh <daniel.oeh@gmail.com> | 2012-07-14 13:54:09 +0200 |
commit | 96d9421970c6b005da5c2b4667e2f52ebd7137d7 (patch) | |
tree | 69c97b5bdda85eedc6d495f4c87c0be2a3a00cae /src/de/danoeh/antennapod | |
parent | bbcdeecc40603246887c1ffe02e6f57a695fe005 (diff) | |
download | AntennaPod-96d9421970c6b005da5c2b4667e2f52ebd7137d7.zip |
Improved startup performance
Diffstat (limited to 'src/de/danoeh/antennapod')
-rw-r--r-- | src/de/danoeh/antennapod/PodcastApp.java | 1 | ||||
-rw-r--r-- | src/de/danoeh/antennapod/feed/FeedManager.java | 98 | ||||
-rw-r--r-- | src/de/danoeh/antennapod/feed/FeedMedia.java | 8 | ||||
-rw-r--r-- | src/de/danoeh/antennapod/storage/PodDBAdapter.java | 35 |
4 files changed, 110 insertions, 32 deletions
diff --git a/src/de/danoeh/antennapod/PodcastApp.java b/src/de/danoeh/antennapod/PodcastApp.java index a82356663..9566d8ca4 100644 --- a/src/de/danoeh/antennapod/PodcastApp.java +++ b/src/de/danoeh/antennapod/PodcastApp.java @@ -8,6 +8,7 @@ import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.os.Debug; import android.preference.PreferenceManager; import android.util.Log; import de.danoeh.antennapod.asynctask.FeedImageLoader; diff --git a/src/de/danoeh/antennapod/feed/FeedManager.java b/src/de/danoeh/antennapod/feed/FeedManager.java index 26a3ffa77..ab29dceef 100644 --- a/src/de/danoeh/antennapod/feed/FeedManager.java +++ b/src/de/danoeh/antennapod/feed/FeedManager.java @@ -569,8 +569,7 @@ public class FeedManager { .getColumnIndex(PodDBAdapter.KEY_LASTUPDATE))); Feed feed = new Feed(lastUpdate); - feed.id = feedlistCursor.getLong(feedlistCursor - .getColumnIndex(PodDBAdapter.KEY_ID)); + feed.id = feedlistCursor.getLong(PodDBAdapter.KEY_INDEX); feed.setTitle(feedlistCursor.getString(feedlistCursor .getColumnIndex(PodDBAdapter.KEY_TITLE))); feed.setLink(feedlistCursor.getString(feedlistCursor @@ -609,12 +608,13 @@ public class FeedManager { Feed feed, Cursor itemlistCursor, PodDBAdapter adapter) { Log.d(TAG, "Extracting Feeditems of feed " + feed.getTitle()); ArrayList<FeedItem> items = new ArrayList<FeedItem>(); + ArrayList<String> mediaIds = new ArrayList<String>(); + if (itemlistCursor.moveToFirst()) { do { FeedItem item = new FeedItem(); - item.id = itemlistCursor.getLong(itemlistCursor - .getColumnIndex(PodDBAdapter.KEY_ID)); + item.id = itemlistCursor.getLong(PodDBAdapter.KEY_INDEX); item.setFeed(feed); item.setTitle(itemlistCursor.getString(itemlistCursor .getColumnIndex(PodDBAdapter.KEY_TITLE))); @@ -631,7 +631,8 @@ public class FeedManager { long mediaId = itemlistCursor.getLong(itemlistCursor .getColumnIndex(PodDBAdapter.KEY_MEDIA)); if (mediaId != 0) { - item.setMedia(adapter.getFeedMedia(mediaId, item)); + mediaIds.add(String.valueOf(mediaId)); + item.setMedia(new FeedMedia(mediaId, item)); } item.read = (itemlistCursor.getInt(itemlistCursor .getColumnIndex(PodDBAdapter.KEY_READ)) > 0) ? true @@ -641,37 +642,87 @@ public class FeedManager { } // extract chapters - Cursor chapterCursor = adapter - .getSimpleChaptersOfFeedItemCursor(item); - if (chapterCursor.moveToFirst()) { - item.setSimpleChapters(new ArrayList<SimpleChapter>()); - do { - SimpleChapter chapter = new SimpleChapter( - chapterCursor - .getLong(chapterCursor - .getColumnIndex(PodDBAdapter.KEY_START)), - chapterCursor.getString(chapterCursor - .getColumnIndex(PodDBAdapter.KEY_TITLE))); - item.getSimpleChapters().add(chapter); - } while (chapterCursor.moveToNext()); + boolean hasSimpleChapters = itemlistCursor + .getInt(itemlistCursor + .getColumnIndex(PodDBAdapter.KEY_HAS_SIMPLECHAPTERS)) > 0; + if (hasSimpleChapters) { + Cursor chapterCursor = adapter + .getSimpleChaptersOfFeedItemCursor(item); + if (chapterCursor.moveToFirst()) { + item.setSimpleChapters(new ArrayList<SimpleChapter>()); + do { + SimpleChapter chapter = new SimpleChapter( + chapterCursor + .getLong(chapterCursor + .getColumnIndex(PodDBAdapter.KEY_START)), + chapterCursor.getString(chapterCursor + .getColumnIndex(PodDBAdapter.KEY_TITLE))); + item.getSimpleChapters().add(chapter); + } while (chapterCursor.moveToNext()); + } + chapterCursor.close(); } - chapterCursor.close(); - items.add(item); } while (itemlistCursor.moveToNext()); } + extractMediafromFeedItemlist(adapter, items, mediaIds); Collections.sort(items, new FeedItemPubdateComparator()); return items; } + private void extractMediafromFeedItemlist(PodDBAdapter adapter, + ArrayList<FeedItem> items, ArrayList<String> mediaIds) { + ArrayList<FeedItem> itemsCopy = new ArrayList<FeedItem>(items); + Cursor cursor = adapter.getFeedMediaCursor(mediaIds + .toArray(new String[mediaIds.size()])); + if (cursor.moveToFirst()) { + do { + long mediaId = cursor.getLong(PodDBAdapter.KEY_INDEX); + // find matching feed item + FeedItem item = getMatchingItemForMedia(mediaId, itemsCopy); + itemsCopy.remove(item); + if (item != null) { + item.setMedia(new FeedMedia( + mediaId, + item, + cursor.getInt(cursor + .getColumnIndex(PodDBAdapter.KEY_DURATION)), + cursor.getInt(cursor + .getColumnIndex(PodDBAdapter.KEY_POSITION)), + cursor.getLong(cursor + .getColumnIndex(PodDBAdapter.KEY_SIZE)), + cursor.getString(cursor + .getColumnIndex(PodDBAdapter.KEY_MIME_TYPE)), + cursor.getString(cursor + .getColumnIndex(PodDBAdapter.KEY_FILE_URL)), + cursor.getString(cursor + .getColumnIndex(PodDBAdapter.KEY_DOWNLOAD_URL)), + cursor.getInt(cursor + .getColumnIndex(PodDBAdapter.KEY_DOWNLOADED)) > 0)); + + } + } while (cursor.moveToNext()); + cursor.close(); + } + } + + private FeedItem getMatchingItemForMedia(long mediaId, + ArrayList<FeedItem> items) { + for (FeedItem item : items) { + if (item.getMedia() != null && item.getMedia().getId() == mediaId) { + return item; + } + } + return null; + } + private void extractDownloadLogFromCursor(Context context, PodDBAdapter adapter) { Log.d(TAG, "Extracting DownloadLog"); Cursor logCursor = adapter.getDownloadLogCursor(); if (logCursor.moveToFirst()) { do { - long id = logCursor.getLong(logCursor - .getColumnIndex(PodDBAdapter.KEY_ID)); + long id = logCursor.getLong(PodDBAdapter.KEY_INDEX); long feedfileId = logCursor.getLong(logCursor .getColumnIndex(PodDBAdapter.KEY_FEEDFILE)); int feedfileType = logCursor.getInt(logCursor @@ -708,8 +759,7 @@ public class FeedManager { Cursor cursor = adapter.getQueueCursor(); if (cursor.moveToFirst()) { do { - int index = cursor.getInt(cursor - .getColumnIndex(PodDBAdapter.KEY_ID)); + int index = cursor.getInt(PodDBAdapter.KEY_INDEX); Feed feed = getFeed(cursor.getLong(cursor .getColumnIndex(PodDBAdapter.KEY_FEED))); if (feed != null) { diff --git a/src/de/danoeh/antennapod/feed/FeedMedia.java b/src/de/danoeh/antennapod/feed/FeedMedia.java index 92059b712..56b95282a 100644 --- a/src/de/danoeh/antennapod/feed/FeedMedia.java +++ b/src/de/danoeh/antennapod/feed/FeedMedia.java @@ -24,6 +24,14 @@ public class FeedMedia extends FeedFile{ this.size = size; this.mime_type = mime_type; } + + + + public FeedMedia(long id,FeedItem item) { + super(); + this.id = id; + this.item = item; + } public int getDuration() { return duration; diff --git a/src/de/danoeh/antennapod/storage/PodDBAdapter.java b/src/de/danoeh/antennapod/storage/PodDBAdapter.java index c9a68717d..6bd2820ac 100644 --- a/src/de/danoeh/antennapod/storage/PodDBAdapter.java +++ b/src/de/danoeh/antennapod/storage/PodDBAdapter.java @@ -26,6 +26,8 @@ public class PodDBAdapter { private static final int DATABASE_VERSION = 1; private static final String DATABASE_NAME = "Antennapod.db"; + public static final int KEY_INDEX = 0; + // Key-constants public static final String KEY_ID = "id"; public static final String KEY_TITLE = "title"; @@ -57,6 +59,7 @@ public class PodDBAdapter { public static final String KEY_START = "start"; public static final String KEY_LANGUAGE = "language"; public static final String KEY_AUTHOR = "author"; + public static final String KEY_HAS_SIMPLECHAPTERS = "has_simple_chapters"; // Table names public static final String TABLE_NAME_FEEDS = "Feeds"; @@ -85,7 +88,7 @@ public class PodDBAdapter { + " TEXT," + KEY_LINK + " TEXT," + KEY_DESCRIPTION + " TEXT," + KEY_CONTENT_ENCODED + " TEXT," + KEY_PUBDATE + " INTEGER," + KEY_MEDIA + " INTEGER," + KEY_FEED + " INTEGER," + KEY_READ - + " INTEGER," + KEY_PAYMENT_LINK + " TEXT)"; + + " INTEGER," + KEY_PAYMENT_LINK + " TEXT," + KEY_HAS_SIMPLECHAPTERS + " INTEGER)"; private static final String CREATE_TABLE_FEED_CATEGORIES = "CREATE TABLE " + TABLE_NAME_FEED_CATEGORIES + " (" + TABLE_PRIMARY_KEY + KEY_NAME @@ -252,8 +255,11 @@ public class PodDBAdapter { } return media.getId(); } - - /** Insert all FeedItems of a feed and the feed object itself in a single transaction */ + + /** + * Insert all FeedItems of a feed and the feed object itself in a single + * transaction + */ public void setCompleteFeed(Feed feed) { db.beginTransaction(); setFeed(feed); @@ -263,7 +269,7 @@ public class PodDBAdapter { db.setTransactionSuccessful(); db.endTransaction(); } - + public long setSingleFeedItem(FeedItem item) { db.beginTransaction(); long result = setFeedItem(item); @@ -296,12 +302,10 @@ public class PodDBAdapter { } values.put(KEY_FEED, item.getFeed().getId()); values.put(KEY_READ, item.isRead()); - + values.put(KEY_HAS_SIMPLECHAPTERS, item.getSimpleChapters() != null); if (item.getId() == 0) { - Log.d(TAG, "inserting new feeditem into db"); item.setId(db.insert(TABLE_NAME_FEED_ITEMS, null, values)); } else { - Log.d(TAG, "updating existing feeditem in db"); db.update(TABLE_NAME_FEED_ITEMS, values, KEY_ID + "=?", new String[] { String.valueOf(item.getId()) }); } @@ -511,7 +515,7 @@ public class PodDBAdapter { final FeedItem owner) throws SQLException { Cursor cursor = db.query(TABLE_NAME_FEED_MEDIA, null, KEY_ID + "=?", new String[] { String.valueOf(rowIndex) }, null, null, null); - if ((cursor.getCount() == 0) || !cursor.moveToFirst()) { + if (!cursor.moveToFirst()) { throw new SQLException("No FeedMedia found at index: " + rowIndex); } FeedMedia media = new FeedMedia(rowIndex, owner, cursor.getInt(cursor @@ -526,6 +530,21 @@ public class PodDBAdapter { return media; } + public final Cursor getFeedMediaCursor(String... mediaIds) { + return db.query(TABLE_NAME_FEED_MEDIA, null, KEY_ID + " IN " + + buildInOperator(mediaIds.length), mediaIds, null, null, null); + } + + /** Builds an IN-operator argument depending on the number of items. */ + private String buildInOperator(int size) { + StringBuffer buffer = new StringBuffer("("); + for (int i = 0; i <= size; i++) { + buffer.append("?,"); + } + buffer.append("?)"); + return buffer.toString(); + } + /** * Searches the DB for a FeedImage of the given id. * |