diff --git a/Clover/app/src/main/java/org/floens/chan/chan/ChanLoader.java b/Clover/app/src/main/java/org/floens/chan/chan/ChanLoader.java index 4b2947d8..492bf809 100644 --- a/Clover/app/src/main/java/org/floens/chan/chan/ChanLoader.java +++ b/Clover/app/src/main/java/org/floens/chan/chan/ChanLoader.java @@ -51,7 +51,6 @@ public class ChanLoader implements Response.ErrorListener, Response.Listener loaders = new HashMap<>(); - public static LoaderPool getInstance() { return instance; } + private Map threadLoaders = new HashMap<>(); + private LruCache threadLoadersCache = new LruCache<>(THREAD_LOADERS_CACHE_SIZE); + + private LoaderPool() { + } + public ChanLoader obtain(Loadable loadable, ChanLoader.ChanLoaderCallback listener) { - ChanLoader chanLoader = loaders.get(loadable); - if (chanLoader == null) { + ChanLoader chanLoader; + if (loadable.isThreadMode()) { + chanLoader = threadLoaders.get(loadable); + if (chanLoader == null) { + chanLoader = threadLoadersCache.get(loadable); + if (chanLoader != null) { + threadLoadersCache.remove(loadable); + threadLoaders.put(loadable, chanLoader); + } + } + + if (chanLoader == null) { + chanLoader = new ChanLoader(loadable); + threadLoaders.put(loadable, chanLoader); + } + } else { chanLoader = new ChanLoader(loadable); - loaders.put(loadable, chanLoader); } chanLoader.addListener(listener); @@ -47,20 +67,20 @@ public class LoaderPool { } public void release(ChanLoader chanLoader, ChanLoader.ChanLoaderCallback listener) { - ChanLoader foundChanLoader = null; - for (Loadable l : loaders.keySet()) { - if (chanLoader.getLoadable().equals(l)) { - foundChanLoader = loaders.get(l); - break; - } - } + Loadable loadable = chanLoader.getLoadable(); + if (loadable.isThreadMode()) { + ChanLoader foundChanLoader = threadLoaders.get(loadable); - if (foundChanLoader == null) { - throw new RuntimeException("The released loader does not exist"); - } + if (foundChanLoader == null) { + throw new IllegalStateException("The released loader does not exist"); + } - if (chanLoader.removeListener(listener)) { - loaders.remove(chanLoader.getLoadable()); + if (chanLoader.removeListener(listener)) { + threadLoaders.remove(loadable); + threadLoadersCache.put(loadable, chanLoader); + } + } else { + chanLoader.removeListener(listener); } } } diff --git a/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java b/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java index d20785d8..98649509 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java +++ b/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java @@ -123,6 +123,14 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt } } + public void requestInitialData() { + if (chanLoader.getThread() == null) { + requestData(); + } else { + chanLoader.quickLoad(); + } + } + public void requestData() { threadPresenterCallback.showLoading(); chanLoader.requestData(); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/ViewThreadController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/ViewThreadController.java index e65cf404..6c1a31eb 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/ViewThreadController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/ViewThreadController.java @@ -27,6 +27,7 @@ import org.floens.chan.chan.ChanUrls; import org.floens.chan.core.manager.WatchManager; import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.Pin; +import org.floens.chan.core.presenter.ThreadPresenter; import org.floens.chan.ui.cell.PostCellInterface; import org.floens.chan.ui.layout.ThreadLayout; import org.floens.chan.ui.toolbar.ToolbarMenu; @@ -121,15 +122,15 @@ public class ViewThreadController extends ThreadController implements ThreadLayo } public void loadThread(Loadable loadable) { - if (!loadable.equals(threadLayout.getPresenter().getLoadable())) { - threadLayout.getPresenter().bindLoadable(loadable); - this.loadable = threadLayout.getPresenter().getLoadable(); - threadLayout.getPresenter().requestData(); + ThreadPresenter presenter = threadLayout.getPresenter(); + if (!loadable.equals(presenter.getLoadable())) { + presenter.bindLoadable(loadable); + this.loadable = presenter.getLoadable(); navigationItem.title = loadable.title; navigationItem.updateTitle(); - setPinIconState(threadLayout.getPresenter().isPinned()); - + setPinIconState(presenter.isPinned()); updateDrawerHighlighting(loadable); + presenter.requestInitialData(); } }