pull/123/head
FongMi 3 years ago
parent bcbf470797
commit 039e2dc81c
  1. 25
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/CollectActivity.java
  2. 15
      app/src/main/java/com/fongmi/android/tv/utils/PauseThreadPoolExecutor.java

@ -27,21 +27,19 @@ import com.fongmi.android.tv.databinding.ActivityCollectBinding;
import com.fongmi.android.tv.model.SiteViewModel; import com.fongmi.android.tv.model.SiteViewModel;
import com.fongmi.android.tv.ui.fragment.CollectFragment; import com.fongmi.android.tv.ui.fragment.CollectFragment;
import com.fongmi.android.tv.ui.presenter.CollectPresenter; import com.fongmi.android.tv.ui.presenter.CollectPresenter;
import com.fongmi.android.tv.utils.PausableThreadPoolExecutor; import com.fongmi.android.tv.utils.PauseThreadPoolExecutor;
import com.fongmi.android.tv.utils.ResUtil; import com.fongmi.android.tv.utils.ResUtil;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
public class CollectActivity extends BaseActivity { public class CollectActivity extends BaseActivity {
private PauseThreadPoolExecutor mExecutor;
private ActivityCollectBinding mBinding; private ActivityCollectBinding mBinding;
private ArrayObjectAdapter mAdapter; private ArrayObjectAdapter mAdapter;
private PausableThreadPoolExecutor mExecutor;
private SiteViewModel mViewModel; private SiteViewModel mViewModel;
private PageAdapter mPageAdapter; private PageAdapter mPageAdapter;
private List<Site> mSites; private List<Site> mSites;
@ -126,7 +124,7 @@ public class CollectActivity extends BaseActivity {
mPageAdapter.notifyDataSetChanged(); mPageAdapter.notifyDataSetChanged();
int core = Runtime.getRuntime().availableProcessors(); int core = Runtime.getRuntime().availableProcessors();
int corePoolSize = Math.max(Constant.THREAD_POOL, core); int corePoolSize = Math.max(Constant.THREAD_POOL, core);
mExecutor = new PausableThreadPoolExecutor(corePoolSize, corePoolSize, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); mExecutor = new PauseThreadPoolExecutor(corePoolSize, corePoolSize, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
mBinding.result.setText(getString(R.string.collect_result, getKeyword())); mBinding.result.setText(getString(R.string.collect_result, getKeyword()));
for (Site site : mSites) mExecutor.execute(() -> search(site)); for (Site site : mSites) mExecutor.execute(() -> search(site));
} }
@ -158,24 +156,21 @@ public class CollectActivity extends BaseActivity {
} }
@Override @Override
public void onBackPressed() { protected void onResume() {
super.onBackPressed(); super.onResume();
if (mExecutor == null) return; if (mExecutor != null) mExecutor.resume();
mExecutor.shutdownNow();
} }
@Override @Override
protected void onPause() { protected void onPause() {
super.onPause(); super.onPause();
if (mExecutor == null) return; if (mExecutor != null) mExecutor.pause();
mExecutor.pause();
} }
@Override @Override
protected void onResume() { public void onBackPressed() {
super.onResume(); super.onBackPressed();
if (mExecutor == null) return; if (mExecutor != null) mExecutor.shutdownNow();
mExecutor.resume();
} }
class PageAdapter extends FragmentStatePagerAdapter { class PageAdapter extends FragmentStatePagerAdapter {

@ -6,20 +6,23 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
public class PausableThreadPoolExecutor extends ThreadPoolExecutor { public class PauseThreadPoolExecutor extends ThreadPoolExecutor {
private final ReentrantLock pauseLock;
private final Condition condition;
private boolean isPaused; private boolean isPaused;
private ReentrantLock pauseLock = new ReentrantLock();
private Condition unpaused = pauseLock.newCondition();
public PausableThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { public PauseThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
pauseLock = new ReentrantLock();
condition = pauseLock.newCondition();
} }
protected void beforeExecute(Thread t, Runnable r) { protected void beforeExecute(Thread t, Runnable r) {
super.beforeExecute(t, r); super.beforeExecute(t, r);
pauseLock.lock(); pauseLock.lock();
try { try {
while (isPaused) unpaused.await(); while (isPaused) condition.await();
} catch (InterruptedException ie) { } catch (InterruptedException ie) {
t.interrupt(); t.interrupt();
} finally { } finally {
@ -40,7 +43,7 @@ public class PausableThreadPoolExecutor extends ThreadPoolExecutor {
pauseLock.lock(); pauseLock.lock();
try { try {
isPaused = false; isPaused = false;
unpaused.signalAll(); condition.signalAll();
} finally { } finally {
pauseLock.unlock(); pauseLock.unlock();
} }
Loading…
Cancel
Save