diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CollectActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CollectActivity.java index c27b8cdaa..b70e8e1df 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CollectActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CollectActivity.java @@ -124,12 +124,14 @@ public class CollectActivity extends BaseActivity { } private void search() { + List sites = getSites(); + if (sites.isEmpty()) return; mAdapter.add(Collect.all()); if (mExecutor != null) stop(); mBinding.pager.getAdapter().notifyDataSetChanged(); - mExecutor = new PauseExecutor(10); + mExecutor = new PauseExecutor(10, sites.size()); mBinding.result.setText(getString(R.string.collect_result, getKeyword())); - for (Site site : getSites()) mExecutor.execute(() -> search(site)); + for (Site site : sites) mExecutor.execute(() -> search(site)); } private void search(Site site) { diff --git a/app/src/main/java/com/fongmi/android/tv/utils/PauseExecutor.java b/app/src/main/java/com/fongmi/android/tv/utils/PauseExecutor.java index a23682a25..cbc344349 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/PauseExecutor.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/PauseExecutor.java @@ -1,6 +1,7 @@ package com.fongmi.android.tv.utils; -import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; @@ -12,8 +13,12 @@ public class PauseExecutor extends ThreadPoolExecutor { private final Condition condition; private boolean isPaused; - public PauseExecutor(int corePoolSize) { - super(corePoolSize, corePoolSize, 0, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>()); + public PauseExecutor(int corePoolSize, int queueCapacity) { + this(corePoolSize, queueCapacity, new ThreadPoolExecutor.AbortPolicy()); + } + + public PauseExecutor(int corePoolSize, int queueCapacity, RejectedExecutionHandler handler) { + super(corePoolSize, corePoolSize, 0, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(queueCapacity), handler); pauseLock = new ReentrantLock(); condition = pauseLock.newCondition(); } @@ -49,5 +54,4 @@ public class PauseExecutor extends ThreadPoolExecutor { pauseLock.unlock(); } } -} - +} \ No newline at end of file diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/CollectFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/CollectFragment.java index 90739e822..bed174ac7 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/CollectFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/CollectFragment.java @@ -116,10 +116,12 @@ public class CollectFragment extends BaseFragment implements MenuProvider, Colle } private void search() { + List sites = getSites(); + if (sites.isEmpty()) return; if (mExecutor != null) mExecutor.shutdownNow(); - mExecutor = new PauseExecutor(20); + mExecutor = new PauseExecutor(20, sites.size()); mCollectAdapter.setItems(List.of(Collect.all()), () -> { - for (Site site : getSites()) mExecutor.execute(() -> search(site, getKeyword())); + for (Site site : sites) mExecutor.execute(() -> search(site, getKeyword())); }); }