From 5f77c4de50a7ec9ad36fc4c57407b1d9ccd39aef Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Sat, 19 Sep 2015 20:39:14 +0200 Subject: Replace some of the most annoying AsyncTasks with RxJava --- .../antennapod/fragment/AllEpisodesFragment.java | 109 +++++++++------------ .../fragment/CompletedDownloadsFragment.java | 92 ++++++++--------- .../antennapod/fragment/DownloadLogFragment.java | 72 ++++++-------- .../antennapod/fragment/ItemlistFragment.java | 90 ++++++++--------- .../antennapod/fragment/NewEpisodesFragment.java | 6 +- .../fragment/PlaybackHistoryFragment.java | 84 +++++++--------- .../danoeh/antennapod/fragment/QueueFragment.java | 95 ++++++++---------- .../danoeh/antennapod/fragment/SearchFragment.java | 92 ++++++++--------- 8 files changed, 283 insertions(+), 357 deletions(-) (limited to 'app/src/main/java/de/danoeh/antennapod') diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java index 5d0edb638..5aed66013 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java @@ -4,10 +4,10 @@ import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.content.SharedPreferences; -import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.Fragment; +import android.support.v4.util.Pair; import android.support.v4.view.MenuItemCompat; import android.support.v7.widget.SearchView; import android.util.Log; @@ -38,7 +38,6 @@ import de.danoeh.antennapod.core.feed.EventDistributor; import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; -import de.danoeh.antennapod.core.feed.QueueEvent; import de.danoeh.antennapod.core.service.download.DownloadService; import de.danoeh.antennapod.core.service.download.Downloader; import de.danoeh.antennapod.core.storage.DBReader; @@ -49,6 +48,10 @@ import de.danoeh.antennapod.core.storage.DownloadRequester; import de.danoeh.antennapod.core.util.LongList; import de.danoeh.antennapod.menuhandler.FeedItemMenuHandler; import de.danoeh.antennapod.menuhandler.MenuItemUtils; +import rx.Observable; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; /** * Shows unread or recently published episodes @@ -90,6 +93,8 @@ public class AllEpisodesFragment extends Fragment { private boolean isUpdatingFeeds; + protected Subscription subscription; + public AllEpisodesFragment() { // by default we show all the episodes this(false, DEFAULT_PREF_NAME); @@ -113,7 +118,7 @@ public class AllEpisodesFragment extends Fragment { @Override public void onResume() { super.onResume(); - startItemLoader(); + loadItems(); } @Override @@ -140,7 +145,9 @@ public class AllEpisodesFragment extends Fragment { public void onStop() { super.onStop(); EventDistributor.getInstance().unregister(contentUpdate); - stopItemLoader(); + if(subscription != null) { + subscription.unsubscribe(); + } } @Override @@ -436,7 +443,7 @@ public class AllEpisodesFragment extends Fragment { @Override public void update(EventDistributor eventDistributor, Integer arg) { if ((arg & EVENTS) != 0) { - startItemLoader(); + loadItems(); if (isUpdatingFeeds != updateRefreshMenuItemChecker.isRefreshing()) { getActivity().supportInvalidateOptionsMenu(); } @@ -453,69 +460,43 @@ public class AllEpisodesFragment extends Fragment { } } - private ItemLoader itemLoader; - - protected void startItemLoader() { - if (itemLoader != null) { - itemLoader.cancel(true); + protected void loadItems() { + if(subscription != null) { + subscription.unsubscribe(); } - itemLoader = new ItemLoader(); - itemLoader.execute(); - } - - protected void stopItemLoader() { - if (itemLoader != null) { - itemLoader.cancel(true); + if (viewsCreated && !itemsLoaded) { + listView.setVisibility(View.GONE); + txtvEmpty.setVisibility(View.GONE); + progLoading.setVisibility(View.VISIBLE); } + subscription = Observable.defer(() -> Observable.just(loadData())) + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(data -> { + listView.setVisibility(View.VISIBLE); + progLoading.setVisibility(View.GONE); + if (data != null) { + episodes = data.first; + queuedItemsIds = data.second; + itemsLoaded = true; + if (viewsCreated && activity.get() != null) { + onFragmentLoaded(); + } + } + }, error -> { + Log.e(TAG, Log.getStackTraceString(error)); + }); } - private class ItemLoader extends AsyncTask { - - @Override - protected void onPreExecute() { - super.onPreExecute(); - if (viewsCreated && !itemsLoaded) { - listView.setVisibility(View.GONE); - txtvEmpty.setVisibility(View.GONE); - progLoading.setVisibility(View.VISIBLE); - } - } - - @Override - protected Object[] doInBackground(Void... params) { - Context context = activity.get(); - if (context != null) { - if(showOnlyNewEpisodes) { - return new Object[] { - DBReader.getNewItemsList(), - DBReader.getQueueIDList(), - null // see ItemAccess.isNew - }; - } else { - return new Object[]{ - DBReader.getRecentlyPublishedEpisodes(RECENT_EPISODES_LIMIT), - DBReader.getQueueIDList() - }; - } - } else { - return null; - } - } - - @Override - protected void onPostExecute(Object[] lists) { - super.onPostExecute(lists); - listView.setVisibility(View.VISIBLE); - progLoading.setVisibility(View.GONE); - - if (lists != null) { - episodes = (List) lists[0]; - queuedItemsIds = (LongList) lists[1]; - itemsLoaded = true; - if (viewsCreated && activity.get() != null) { - onFragmentLoaded(); - } - } + private Pair,LongList> loadData() { + List items; + if(showOnlyNewEpisodes) { + items = DBReader.getNewItemsList(); + } else { + items = DBReader.getRecentlyPublishedEpisodes(RECENT_EPISODES_LIMIT); } + LongList queuedIds = DBReader.getQueueIDList(); + return Pair.create(items, queuedIds); } + } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java index 278928f3d..c5b582d3a 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java @@ -1,14 +1,12 @@ package de.danoeh.antennapod.fragment; import android.app.Activity; -import android.content.Context; -import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.ListFragment; +import android.util.Log; import android.view.View; import android.widget.ListView; -import java.util.Collections; import java.util.List; import de.danoeh.antennapod.R; @@ -18,11 +16,18 @@ import de.danoeh.antennapod.core.feed.EventDistributor; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBWriter; +import rx.Observable; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; /** * Displays all running downloads and provides a button to delete them */ public class CompletedDownloadsFragment extends ListFragment { + + private static final String TAG = CompletedDownloadsFragment.class.getSimpleName(); + private static final int EVENTS = EventDistributor.DOWNLOAD_HANDLED | EventDistributor.DOWNLOADLOG_UPDATE | @@ -34,11 +39,12 @@ public class CompletedDownloadsFragment extends ListFragment { private boolean viewCreated = false; private boolean itemsLoaded = false; + private Subscription subscription; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - - startItemLoader(); + loadItems(); } @Override @@ -51,13 +57,17 @@ public class CompletedDownloadsFragment extends ListFragment { public void onStop() { super.onStop(); EventDistributor.getInstance().unregister(contentUpdate); - stopItemLoader(); + if(subscription != null) { + subscription.unsubscribe(); + } } @Override public void onDetach() { super.onDetach(); - stopItemLoader(); + if(subscription != null) { + subscription.unsubscribe(); + } } @Override @@ -65,7 +75,9 @@ public class CompletedDownloadsFragment extends ListFragment { super.onDestroyView(); listAdapter = null; viewCreated = false; - stopItemLoader(); + if(subscription != null) { + subscription.unsubscribe(); + } } @Override @@ -132,56 +144,32 @@ public class CompletedDownloadsFragment extends ListFragment { @Override public void update(EventDistributor eventDistributor, Integer arg) { if ((arg & EVENTS) != 0) { - startItemLoader(); + loadItems(); } } }; - private ItemLoader itemLoader; - - private void startItemLoader() { - if (itemLoader != null) { - itemLoader.cancel(true); + private void loadItems() { + if(subscription != null) { + subscription.unsubscribe(); } - itemLoader = new ItemLoader(); - itemLoader.execute(); - } - - private void stopItemLoader() { - if (itemLoader != null) { - itemLoader.cancel(true); + if (!itemsLoaded && viewCreated) { + setListShown(false); } + subscription = Observable.defer(() -> Observable.just(DBReader.getDownloadedItems())) + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(result -> { + if (result != null) { + items = result; + itemsLoaded = true; + if (viewCreated && getActivity() != null) { + onFragmentLoaded(); + } + } + }, error -> { + Log.e(TAG, Log.getStackTraceString(error)); + }); } - private class ItemLoader extends AsyncTask> { - - @Override - protected void onPreExecute() { - super.onPreExecute(); - if (!itemsLoaded && viewCreated) { - setListShown(false); - } - } - - @Override - protected void onPostExecute(List results) { - super.onPostExecute(results); - if (results != null) { - items = results; - itemsLoaded = true; - if (viewCreated && getActivity() != null) { - onFragmentLoaded(); - } - } - } - - @Override - protected List doInBackground(Void... params) { - Context context = getActivity(); - if (context != null) { - return DBReader.getDownloadedItems(); - } - return Collections.emptyList(); - } - } } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java index da2c05a69..669c6ac49 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java @@ -1,11 +1,10 @@ package de.danoeh.antennapod.fragment; -import android.content.Context; import android.content.res.TypedArray; -import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.ListFragment; import android.support.v4.view.MenuItemCompat; +import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -20,6 +19,10 @@ import de.danoeh.antennapod.core.feed.EventDistributor; import de.danoeh.antennapod.core.service.download.DownloadStatus; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBWriter; +import rx.Observable; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; /** * Shows the download log @@ -34,19 +37,23 @@ public class DownloadLogFragment extends ListFragment { private boolean viewsCreated = false; private boolean itemsLoaded = false; + private Subscription subscription; + @Override public void onStart() { super.onStart(); setHasOptionsMenu(true); EventDistributor.getInstance().register(contentUpdate); - startItemLoader(); + loadItems(); } @Override public void onStop() { super.onStop(); EventDistributor.getInstance().unregister(contentUpdate); - stopItemLoader(); + if(subscription != null) { + subscription.unsubscribe(); + } } @Override @@ -93,27 +100,11 @@ public class DownloadLogFragment extends ListFragment { @Override public void update(EventDistributor eventDistributor, Integer arg) { if ((arg & EventDistributor.DOWNLOADLOG_UPDATE) != 0) { - startItemLoader(); + loadItems(); } } }; - private ItemLoader itemLoader; - - private void startItemLoader() { - if (itemLoader != null) { - itemLoader.cancel(true); - } - itemLoader = new ItemLoader(); - itemLoader.execute(); - } - - private void stopItemLoader() { - if (itemLoader != null) { - itemLoader.cancel(true); - } - } - @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); @@ -152,27 +143,24 @@ public class DownloadLogFragment extends ListFragment { } } - private class ItemLoader extends AsyncTask> { - - @Override - protected void onPostExecute(List downloadStatuses) { - super.onPostExecute(downloadStatuses); - if (downloadStatuses != null) { - downloadLog = downloadStatuses; - itemsLoaded = true; - if (viewsCreated) { - onFragmentLoaded(); - } - } - } - - @Override - protected List doInBackground(Void... params) { - Context context = getActivity(); - if (context != null) { - return DBReader.getDownloadLog(); - } - return null; + private void loadItems() { + if(subscription != null) { + subscription.unsubscribe(); } + subscription = Observable.defer(() -> Observable.just(DBReader.getDownloadLog())) + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(result -> { + if (result != null) { + downloadLog = result; + itemsLoaded = true; + if (viewsCreated) { + onFragmentLoaded(); + } + } + }, error -> { + Log.e(TAG, Log.getStackTraceString(error)); + }); } + } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java index 38c9b645a..3d0ff66f7 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java @@ -7,12 +7,12 @@ import android.content.Intent; import android.content.res.TypedArray; import android.graphics.Color; import android.graphics.LightingColorFilter; -import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.Fragment; import android.support.v4.app.ListFragment; +import android.support.v4.util.Pair; import android.support.v4.view.MenuItemCompat; import android.support.v7.app.ActionBarActivity; import android.support.v7.widget.SearchView; @@ -73,6 +73,10 @@ import de.danoeh.antennapod.menuhandler.FeedItemMenuHandler; import de.danoeh.antennapod.menuhandler.FeedMenuHandler; import de.danoeh.antennapod.menuhandler.MenuItemUtils; import de.greenrobot.event.EventBus; +import rx.Observable; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; /** * Displays a list of FeedItems. @@ -111,6 +115,8 @@ public class ItemlistFragment extends ListFragment { private TextView txtvInformation; + private Subscription subscription; + /** * Creates new ItemlistFragment which shows the Feeditems of a specific * feed. Sets 'showFeedtitle' to false @@ -156,7 +162,9 @@ public class ItemlistFragment extends ListFragment { super.onStop(); EventDistributor.getInstance().unregister(contentUpdate); EventBus.getDefault().unregister(this); - stopItemLoader(); + if(subscription != null) { + subscription.unsubscribe(); + } } @Override @@ -164,13 +172,15 @@ public class ItemlistFragment extends ListFragment { super.onResume(); Log.d(TAG, "onResume()"); updateProgressBarVisibility(); - startItemLoader(); + loadItems(); } @Override public void onDetach() { super.onDetach(); - stopItemLoader(); + if(subscription != null) { + subscription.unsubscribe(); + } } @Override @@ -385,13 +395,13 @@ public class ItemlistFragment extends ListFragment { public void onEvent(QueueEvent event) { Log.d(TAG, "onEvent(" + event + ")"); - startItemLoader(); + loadItems(); } public void onEvent(FeedEvent event) { Log.d(TAG, "onEvent(" + event + ")"); if(event.feedId == feedID) { - startItemLoader(); + loadItems(); } } @@ -404,7 +414,7 @@ public class ItemlistFragment extends ListFragment { if ((EventDistributor.DOWNLOAD_QUEUED & arg) != 0) { updateProgressBarVisibility(); } else { - startItemLoader(); + loadItems(); updateProgressBarVisibility(); } } @@ -608,51 +618,37 @@ public class ItemlistFragment extends ListFragment { } }; - private ItemLoader itemLoader; - private void startItemLoader() { - if (itemLoader != null) { - itemLoader.cancel(true); + private void loadItems() { + if(subscription != null) { + subscription.unsubscribe(); } - itemLoader = new ItemLoader(); - itemLoader.execute(feedID); - } - private void stopItemLoader() { - if (itemLoader != null) { - itemLoader.cancel(true); - } + subscription = Observable.defer(() -> Observable.just(loadData())) + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(result -> { + if (result != null) { + feed = result.first; + queuedItemsIds = result.second; + itemsLoaded = true; + if (viewsCreated) { + onFragmentLoaded(); + } + } + }, error -> { + Log.e(TAG, Log.getStackTraceString(error)); + }); } - private class ItemLoader extends AsyncTask { - @Override - protected Object[] doInBackground(Long... params) { - long feedID = params[0]; - Context context = getActivity(); - if (context != null) { - Feed feed = DBReader.getFeed(feedID); - if(feed != null && feed.getItemFilter() != null) { - FeedItemFilter filter = feed.getItemFilter(); - feed.setItems(filter.filter(context, feed.getItems())); - } - LongList queuedItemsIds = DBReader.getQueueIDList(); - return new Object[] { feed, queuedItemsIds }; - } else { - return null; - } - } - - @Override - protected void onPostExecute(Object[] res) { - super.onPostExecute(res); - if (res != null) { - feed = (Feed) res[0]; - queuedItemsIds = (LongList) res[1]; - itemsLoaded = true; - if (viewsCreated) { - onFragmentLoaded(); - } - } + private Pair loadData() { + Feed feed = DBReader.getFeed(feedID); + if(feed != null && feed.getItemFilter() != null) { + FeedItemFilter filter = feed.getItemFilter(); + feed.setItems(filter.filter(feed.getItems())); } + LongList queuedItemsIds = DBReader.getQueueIDList(); + return Pair.create(feed, queuedItemsIds); } + } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java index 6177f2a50..d454208c1 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java @@ -39,7 +39,7 @@ public class NewEpisodesFragment extends AllEpisodesFragment { public void onEvent(QueueEvent event) { Log.d(TAG, "onEvent(" + event + ")"); - startItemLoader(); + loadItems(); } @Override @@ -69,7 +69,9 @@ public class NewEpisodesFragment extends AllEpisodesFragment { @Override public void remove(int which) { Log.d(TAG, "remove(" + which + ")"); - stopItemLoader(); + if(subscription != null) { + subscription.unsubscribe(); + } FeedItem item = (FeedItem) listView.getAdapter().getItem(which); // we're marking it as unplayed since the user didn't actually play it // but they don't want it considered 'NEW' anymore diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java index 530883667..e6460309b 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java @@ -1,9 +1,7 @@ package de.danoeh.antennapod.fragment; import android.app.Activity; -import android.content.Context; import android.content.res.TypedArray; -import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.ListFragment; @@ -33,6 +31,10 @@ import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.util.LongList; import de.greenrobot.event.EventBus; +import rx.Observable; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; public class PlaybackHistoryFragment extends ListFragment { @@ -53,6 +55,8 @@ public class PlaybackHistoryFragment extends ListFragment { private DownloadObserver downloadObserver; private List downloaderList; + private Subscription subscription; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -63,7 +67,7 @@ public class PlaybackHistoryFragment extends ListFragment { @Override public void onResume() { super.onResume(); - startItemLoader(); + loadItems(); } @Override @@ -78,13 +82,17 @@ public class PlaybackHistoryFragment extends ListFragment { super.onStop(); EventDistributor.getInstance().unregister(contentUpdate); EventBus.getDefault().unregister(this); - stopItemLoader(); + if(subscription != null) { + subscription.unsubscribe(); + } } @Override public void onDetach() { super.onDetach(); - stopItemLoader(); + if(subscription != null) { + subscription.unsubscribe(); + } activity.set(null); } @@ -176,7 +184,7 @@ public class PlaybackHistoryFragment extends ListFragment { public void onEvent(QueueEvent event) { Log.d(TAG, "onEvent(" + event + ")"); - startItemLoader(); + loadItems(); } private EventDistributor.EventListener contentUpdate = new EventDistributor.EventListener() { @@ -184,7 +192,7 @@ public class PlaybackHistoryFragment extends ListFragment { @Override public void update(EventDistributor eventDistributor, Integer arg) { if ((arg & EVENTS) != 0) { - startItemLoader(); + loadItems(); getActivity().supportInvalidateOptionsMenu(); } } @@ -245,48 +253,32 @@ public class PlaybackHistoryFragment extends ListFragment { } }; - private ItemLoader itemLoader; - - private void startItemLoader() { - if (itemLoader != null) { - itemLoader.cancel(true); + private void loadItems() { + if(subscription != null) { + subscription.unsubscribe(); } - itemLoader = new ItemLoader(); - itemLoader.execute(); + subscription = Observable.defer(() -> Observable.just(loadData())) + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(result -> { + if (result != null) { + playbackHistory = result.first; + queue = result.second; + itemsLoaded = true; + if (viewsCreated) { + onFragmentLoaded(); + } + } + }, error -> { + Log.e(TAG, Log.getStackTraceString(error)); + }); } - private void stopItemLoader() { - if (itemLoader != null) { - itemLoader.cancel(true); - } + private Pair, LongList> loadData() { + List history = DBReader.getPlaybackHistory(); + LongList queue = DBReader.getQueueIDList(); + DBReader.loadFeedDataOfFeedItemlist(history); + return Pair.create(history, queue); } - private class ItemLoader extends AsyncTask,LongList>> { - - @Override - protected Pair,LongList> doInBackground(Void... params) { - Context context = activity.get(); - if (context != null) { - List history = DBReader.getPlaybackHistory(); - LongList queue = DBReader.getQueueIDList(); - DBReader.loadFeedDataOfFeedItemlist(history); - return Pair.create(history, queue); - } else { - return null; - } - } - - @Override - protected void onPostExecute(Pair,LongList> res) { - super.onPostExecute(res); - if (res != null) { - playbackHistory = res.first; - queue = res.second; - itemsLoaded = true; - if (viewsCreated) { - onFragmentLoaded(); - } - } - } - } } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java index 63c319e03..7bcd98dc8 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -4,7 +4,6 @@ import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.content.SharedPreferences; -import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.Fragment; @@ -55,6 +54,10 @@ import de.danoeh.antennapod.core.util.gui.UndoBarController; import de.danoeh.antennapod.menuhandler.FeedItemMenuHandler; import de.danoeh.antennapod.menuhandler.MenuItemUtils; import de.greenrobot.event.EventBus; +import rx.Observable; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; /** * Shows all items in the queue @@ -98,6 +101,8 @@ public class QueueFragment extends Fragment { */ private boolean blockDownloadObserverUpdate = false; + private Subscription subscription; + @Override public void onCreate(Bundle savedInstanceState) { @@ -109,7 +114,7 @@ public class QueueFragment extends Fragment { @Override public void onResume() { super.onResume(); - startItemLoader(); + loadItems(); } @Override @@ -138,7 +143,9 @@ public class QueueFragment extends Fragment { super.onStop(); EventDistributor.getInstance().unregister(contentUpdate); EventBus.getDefault().unregister(this); - stopItemLoader(); + if(subscription != null) { + subscription.unsubscribe(); + } if(undoBarController.isShowing()) { undoBarController.close(); } @@ -156,7 +163,7 @@ public class QueueFragment extends Fragment { undoBarController.showUndoBar(false, getString(R.string.removed_from_queue), new FeedItemUndoToken(event.item, event.position)); } - startItemLoader(); + loadItems(); } private void saveScrollPosition() { @@ -398,7 +405,9 @@ public class QueueFragment extends Fragment { public void drop(int from, int to) { Log.d(TAG, "drop"); blockDownloadObserverUpdate = false; - stopItemLoader(); + if(subscription != null) { + subscription.unsubscribe(); + } final FeedItem item = queue.remove(from); queue.add(to, item); listAdapter.notifyDataSetChanged(); @@ -408,7 +417,9 @@ public class QueueFragment extends Fragment { @Override public void remove(int which) { Log.d(TAG, "remove(" + which + ")"); - stopItemLoader(); + if(subscription != null) { + subscription.unsubscribe(); + } FeedItem item = (FeedItem) listView.getAdapter().getItem(which); DBWriter.removeQueueItem(getActivity(), item, true); } @@ -556,7 +567,7 @@ public class QueueFragment extends Fragment { @Override public void update(EventDistributor eventDistributor, Integer arg) { if ((arg & EVENTS) != 0) { - startItemLoader(); + loadItems(); if (isUpdatingFeeds != updateRefreshMenuItemChecker.isRefreshing()) { getActivity().supportInvalidateOptionsMenu(); } @@ -564,55 +575,31 @@ public class QueueFragment extends Fragment { } }; - private ItemLoader itemLoader; - - private void startItemLoader() { - if (itemLoader != null) { - itemLoader.cancel(true); + private void loadItems() { + if(subscription != null) { + subscription.unsubscribe(); } - itemLoader = new ItemLoader(); - itemLoader.execute(); - } - - private void stopItemLoader() { - if (itemLoader != null) { - itemLoader.cancel(true); + if (viewsCreated && !itemsLoaded) { + listView.setVisibility(View.GONE); + txtvEmpty.setVisibility(View.GONE); + progLoading.setVisibility(View.VISIBLE); } + subscription = Observable.defer(() -> Observable.just(DBReader.getQueue())) + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(result -> { + listView.setVisibility(View.VISIBLE); + progLoading.setVisibility(View.GONE); + if(result != null) { + queue = result; + itemsLoaded = true; + if (viewsCreated && activity.get() != null) { + onFragmentLoaded(); + } + } + }, error -> { + Log.e(TAG, Log.getStackTraceString(error)); + }); } - private class ItemLoader extends AsyncTask> { - @Override - protected void onPreExecute() { - super.onPreExecute(); - if (viewsCreated && !itemsLoaded) { - listView.setVisibility(View.GONE); - txtvEmpty.setVisibility(View.GONE); - progLoading.setVisibility(View.VISIBLE); - } - } - - @Override - protected void onPostExecute(List feedItems) { - super.onPostExecute(feedItems); - listView.setVisibility(View.VISIBLE); - progLoading.setVisibility(View.GONE); - - if (feedItems != null) { - queue = feedItems; - itemsLoaded = true; - if (viewsCreated && activity.get() != null) { - onFragmentLoaded(); - } - } - } - - @Override - protected List doInBackground(Void... params) { - Context context = activity.get(); - if (context != null) { - return DBReader.getQueue(); - } - return null; - } - } } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java index 975493ce9..edd8cdd1a 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java @@ -1,19 +1,18 @@ package de.danoeh.antennapod.fragment; import android.content.Context; -import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.ListFragment; import android.support.v4.view.MenuItemCompat; import android.support.v7.app.ActionBarActivity; import android.support.v7.widget.SearchView; +import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.ListView; -import java.util.Collections; import java.util.List; import de.danoeh.antennapod.R; @@ -25,6 +24,10 @@ import de.danoeh.antennapod.core.feed.FeedComponent; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.SearchResult; import de.danoeh.antennapod.core.storage.FeedSearcher; +import rx.Observable; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; /** * Performs a search operation on all feeds or one specific feed and displays the search result. @@ -41,6 +44,8 @@ public class SearchFragment extends ListFragment { private boolean viewCreated = false; private boolean itemsLoaded = false; + private Subscription subscription; + /** * Create a new SearchFragment that searches all feeds. */ @@ -68,7 +73,7 @@ public class SearchFragment extends ListFragment { super.onCreate(savedInstanceState); setRetainInstance(true); setHasOptionsMenu(true); - startSearchTask(); + search(); } @Override @@ -80,14 +85,18 @@ public class SearchFragment extends ListFragment { @Override public void onStop() { super.onStop(); - stopSearchTask(); + if(subscription != null) { + subscription.unsubscribe(); + } EventDistributor.getInstance().unregister(contentUpdate); } @Override public void onDetach() { super.onDetach(); - stopSearchTask(); + if(subscription != null) { + subscription.unsubscribe(); + } } @Override @@ -143,7 +152,7 @@ public class SearchFragment extends ListFragment { public boolean onQueryTextSubmit(String s) { getArguments().putString(ARG_QUERY, s); itemsLoaded = false; - startSearchTask(); + search(); return true; } @@ -161,7 +170,7 @@ public class SearchFragment extends ListFragment { public void update(EventDistributor eventDistributor, Integer arg) { if ((arg & (EventDistributor.UNREAD_ITEMS_UPDATE | EventDistributor.DOWNLOAD_HANDLED)) != 0) { - startSearchTask(); + search(); } } }; @@ -187,53 +196,36 @@ public class SearchFragment extends ListFragment { } }; - private SearchTask searchTask; - private void startSearchTask() { - if (searchTask != null) { - searchTask.cancel(true); + private void search() { + if(subscription != null) { + subscription.unsubscribe(); } - searchTask = new SearchTask(); - searchTask.execute(getArguments()); - } - - private void stopSearchTask() { - if (searchTask != null) { - searchTask.cancel(true); + if (viewCreated && !itemsLoaded) { + setListShown(false); } + subscription = Observable.defer(() -> Observable.just(performSearch())) + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(result -> { + if (result != null) { + itemsLoaded = true; + searchResults = result; + if (viewCreated) { + onFragmentLoaded(); + } + } + }, error -> { + Log.e(TAG, Log.getStackTraceString(error)); + }); } - private class SearchTask extends AsyncTask> { - @Override - protected List doInBackground(Bundle... params) { - String query = params[0].getString(ARG_QUERY); - long feed = params[0].getLong(ARG_FEED); - Context context = getActivity(); - if (context != null) { - return FeedSearcher.performSearch(context, query, feed); - } else { - return Collections.emptyList(); - } - } - - @Override - protected void onPreExecute() { - super.onPreExecute(); - if (viewCreated && !itemsLoaded) { - setListShown(false); - } - } - - @Override - protected void onPostExecute(List results) { - super.onPostExecute(results); - if (results != null) { - itemsLoaded = true; - searchResults = results; - if (viewCreated) { - onFragmentLoaded(); - } - } - } + private List performSearch() { + Bundle args = getArguments(); + String query = args.getString(ARG_QUERY); + long feed = args.getLong(ARG_FEED); + Context context = getActivity(); + return FeedSearcher.performSearch(context, query, feed); } + } -- cgit v1.2.3