From 00e884ca0098e76badf4c94248c67d6b9125803f Mon Sep 17 00:00:00 2001 From: Dehong <1252825428@qq.com> Date: Fri, 17 Feb 2023 18:35:37 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E5=B1=95=E7=A4=BA=E8=BF=87=E7=A8=8B=EF=BC=8C=E7=A6=BB=E5=BC=80?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E9=A1=B5=E6=9A=82=E5=81=9C=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E6=B1=A0=EF=BC=8C=E5=9B=9E=E5=88=B0=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E9=A1=B5=E6=97=B6=E7=BB=A7=E7=BB=AD=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E6=B1=A0=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tv/ui/activity/CollectActivity.java | 23 +++++++-- .../tv/utils/PausableThreadPoolExecutor.java | 49 +++++++++++++++++++ 2 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/com/fongmi/android/tv/utils/PausableThreadPoolExecutor.java 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 58a88339c..ce26ba7d3 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 @@ -27,18 +27,21 @@ import com.fongmi.android.tv.databinding.ActivityCollectBinding; import com.fongmi.android.tv.model.SiteViewModel; import com.fongmi.android.tv.ui.fragment.CollectFragment; import com.fongmi.android.tv.ui.presenter.CollectPresenter; +import com.fongmi.android.tv.utils.PausableThreadPoolExecutor; import com.fongmi.android.tv.utils.ResUtil; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; public class CollectActivity extends BaseActivity { private ActivityCollectBinding mBinding; private ArrayObjectAdapter mAdapter; - private ExecutorService mExecutor; + private PausableThreadPoolExecutor mExecutor; private SiteViewModel mViewModel; private PageAdapter mPageAdapter; private List mSites; @@ -121,7 +124,8 @@ public class CollectActivity extends BaseActivity { private void search() { mAdapter.add(Collect.all()); mPageAdapter.notifyDataSetChanged(); - mExecutor = Executors.newFixedThreadPool(Constant.THREAD_POOL); + int core = Runtime.getRuntime().availableProcessors(); + mExecutor = new PausableThreadPoolExecutor(core, core * 2, 10, TimeUnit.SECONDS, new LinkedBlockingQueue(100)); mBinding.result.setText(getString(R.string.collect_result, getKeyword())); for (Site site : mSites) mExecutor.execute(() -> search(site)); } @@ -157,7 +161,20 @@ public class CollectActivity extends BaseActivity { super.onBackPressed(); if (mExecutor == null) return; mExecutor.shutdownNow(); - mExecutor = null; + } + + @Override + protected void onPause() { + super.onPause(); + if (mExecutor == null) return; + mExecutor.pause(); + } + + @Override + protected void onResume() { + super.onResume(); + if (mExecutor == null) return; + mExecutor.resume(); } class PageAdapter extends FragmentStatePagerAdapter { diff --git a/app/src/main/java/com/fongmi/android/tv/utils/PausableThreadPoolExecutor.java b/app/src/main/java/com/fongmi/android/tv/utils/PausableThreadPoolExecutor.java new file mode 100644 index 000000000..f048f95bb --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/utils/PausableThreadPoolExecutor.java @@ -0,0 +1,49 @@ +package com.fongmi.android.tv.utils; + +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.ReentrantLock; + +public class PausableThreadPoolExecutor extends ThreadPoolExecutor { + private boolean isPaused; + private ReentrantLock pauseLock = new ReentrantLock(); + private Condition unpaused = pauseLock.newCondition(); + + public PausableThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue) { + super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); + } + + protected void beforeExecute(Thread t, Runnable r) { + super.beforeExecute(t, r); + pauseLock.lock(); + try { + while (isPaused) unpaused.await(); + } catch (InterruptedException ie) { + t.interrupt(); + } finally { + pauseLock.unlock(); + } + } + + public void pause() { + pauseLock.lock(); + try { + isPaused = true; + } finally { + pauseLock.unlock(); + } + } + + public void resume() { + pauseLock.lock(); + try { + isPaused = false; + unpaused.signalAll(); + } finally { + pauseLock.unlock(); + } + } +} + From a14032e48720369613b64086faba8383b646223f Mon Sep 17 00:00:00 2001 From: Dehong <1252825428@qq.com> Date: Sun, 19 Feb 2023 00:45:18 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E5=B1=95=E7=A4=BA=E8=BF=87=E7=A8=8B=EF=BC=8C=E7=A6=BB=E5=BC=80?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E9=A1=B5=E6=9A=82=E5=81=9C=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E6=B1=A0=EF=BC=8C=E5=9B=9E=E5=88=B0=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E9=A1=B5=E6=97=B6=E7=BB=A7=E7=BB=AD=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E6=B1=A0=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fongmi/android/tv/ui/activity/CollectActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 ce26ba7d3..21ec46af5 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 @@ -125,7 +125,7 @@ public class CollectActivity extends BaseActivity { mAdapter.add(Collect.all()); mPageAdapter.notifyDataSetChanged(); int core = Runtime.getRuntime().availableProcessors(); - mExecutor = new PausableThreadPoolExecutor(core, core * 2, 10, TimeUnit.SECONDS, new LinkedBlockingQueue(100)); + mExecutor = new PausableThreadPoolExecutor(Math.max(Constant.THREAD_POOL, core), core * 2, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue()); mBinding.result.setText(getString(R.string.collect_result, getKeyword())); for (Site site : mSites) mExecutor.execute(() -> search(site)); } From 026cdd0ded9ef82ec11fc5e54b013e19d9be501a Mon Sep 17 00:00:00 2001 From: Dehong <1252825428@qq.com> Date: Sun, 19 Feb 2023 00:53:39 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E5=B1=95=E7=A4=BA=E8=BF=87=E7=A8=8B=EF=BC=8C=E7=A6=BB=E5=BC=80?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E9=A1=B5=E6=9A=82=E5=81=9C=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E6=B1=A0=EF=BC=8C=E5=9B=9E=E5=88=B0=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E9=A1=B5=E6=97=B6=E7=BB=A7=E7=BB=AD=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E6=B1=A0=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fongmi/android/tv/ui/activity/CollectActivity.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 21ec46af5..2f75d38e6 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 @@ -125,7 +125,8 @@ public class CollectActivity extends BaseActivity { mAdapter.add(Collect.all()); mPageAdapter.notifyDataSetChanged(); int core = Runtime.getRuntime().availableProcessors(); - mExecutor = new PausableThreadPoolExecutor(Math.max(Constant.THREAD_POOL, core), core * 2, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue()); + int corePoolSize = Math.max(Constant.THREAD_POOL, core); + mExecutor = new PausableThreadPoolExecutor(corePoolSize, corePoolSize, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue()); mBinding.result.setText(getString(R.string.collect_result, getKeyword())); for (Site site : mSites) mExecutor.execute(() -> search(site)); }