From eed819fd15b8a0da4c9dae3c1c54b0f7697bcae9 Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 27 Feb 2025 14:10:24 +0800 Subject: [PATCH] Optimize scan task --- .../android/tv/ui/dialog/CastDialog.java | 12 ++++- .../android/tv/ui/dialog/SyncDialog.java | 14 ++++-- .../com/fongmi/android/tv/utils/ScanTask.java | 47 ++++++++++++------- .../github/catvod/net/OkProxySelector.java | 7 ++- 4 files changed, 55 insertions(+), 25 deletions(-) rename app/src/{main => mobile}/java/com/fongmi/android/tv/utils/ScanTask.java (61%) diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/CastDialog.java b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/CastDialog.java index 37f5c2b75..9f2231c90 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/CastDialog.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/CastDialog.java @@ -54,6 +54,7 @@ public class CastDialog extends BaseDialog implements DeviceAdapter.OnClickListe private final FormBody.Builder body; private final OkHttpClient client; + private final ScanTask scanTask; private DialogDeviceBinding binding; private DeviceAdapter adapter; @@ -67,6 +68,7 @@ public class CastDialog extends BaseDialog implements DeviceAdapter.OnClickListe } public CastDialog() { + scanTask = new ScanTask(this); body = new FormBody.Builder(); body.add("device", Device.get().toString()); body.add("config", Config.vod().toString()); @@ -139,7 +141,7 @@ public class CastDialog extends BaseDialog implements DeviceAdapter.OnClickListe } private void onRefresh() { - if (fm) ScanTask.create(this).start(adapter.getIps()); + if (fm) scanTask.start(adapter.getIps()); DLNACastManager.INSTANCE.search(null); adapter.clear(); } @@ -151,7 +153,7 @@ public class CastDialog extends BaseDialog implements DeviceAdapter.OnClickListe @Subscribe(threadMode = ThreadMode.MAIN) public void onScanEvent(ScanEvent event) { - ScanTask.create(this).start(event.getAddress()); + scanTask.start(event.getAddress()); } @Override @@ -217,6 +219,12 @@ public class CastDialog extends BaseDialog implements DeviceAdapter.OnClickListe DLNACastManager.INSTANCE.unbindCastService(App.get()); } + @Override + public void onDestroy() { + super.onDestroy(); + scanTask.stop(); + } + @Override public void onAvTransportStateChanged(@NonNull TransportState state) { } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/SyncDialog.java b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/SyncDialog.java index e2b0a3f66..e628d472e 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/SyncDialog.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/SyncDialog.java @@ -48,6 +48,7 @@ public class SyncDialog extends BaseDialog implements DeviceAdapter.OnClickListe private final FormBody.Builder body; private final OkHttpClient client; + private final ScanTask scanTask; private final TypedArray mode; private DialogDeviceBinding binding; private DeviceAdapter adapter; @@ -58,9 +59,10 @@ public class SyncDialog extends BaseDialog implements DeviceAdapter.OnClickListe } public SyncDialog() { + body = new FormBody.Builder(); + scanTask = new ScanTask(this); client = OkHttp.client(Constant.TIMEOUT_SYNC); mode = ResUtil.getTypedArray(R.array.cast_mode); - body = new FormBody.Builder(); } public SyncDialog history() { @@ -136,7 +138,7 @@ public class SyncDialog extends BaseDialog implements DeviceAdapter.OnClickListe } private void onRefresh() { - ScanTask.create(this).start(adapter.getIps()); + scanTask.start(adapter.getIps()); adapter.clear(); } @@ -146,7 +148,7 @@ public class SyncDialog extends BaseDialog implements DeviceAdapter.OnClickListe @Subscribe(threadMode = ThreadMode.MAIN) public void onScanEvent(ScanEvent event) { - ScanTask.create(this).start(event.getAddress()); + scanTask.start(event.getAddress()); } @Override @@ -188,4 +190,10 @@ public class SyncDialog extends BaseDialog implements DeviceAdapter.OnClickListe super.onDestroyView(); EventBus.getDefault().unregister(this); } + + @Override + public void onDestroy() { + super.onDestroy(); + scanTask.stop(); + } } diff --git a/app/src/main/java/com/fongmi/android/tv/utils/ScanTask.java b/app/src/mobile/java/com/fongmi/android/tv/utils/ScanTask.java similarity index 61% rename from app/src/main/java/com/fongmi/android/tv/utils/ScanTask.java rename to app/src/mobile/java/com/fongmi/android/tv/utils/ScanTask.java index bc39c3394..964b7dc6e 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/ScanTask.java +++ b/app/src/mobile/java/com/fongmi/android/tv/utils/ScanTask.java @@ -6,27 +6,28 @@ import com.fongmi.android.tv.server.Server; import com.github.catvod.net.OkHttp; import java.util.ArrayList; -import java.util.Arrays; -import java.util.LinkedHashSet; +import java.util.Collections; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import okhttp3.OkHttpClient; public class ScanTask { - private final Listener listener; - private final OkHttpClient client; private final List devices; + private final OkHttpClient client; - public static ScanTask create(Listener listener) { - return new ScanTask(listener); - } + private ExecutorService executor; + private Listener listener; public ScanTask(Listener listener) { - this.listener = listener; + this.devices = Collections.synchronizedList(new ArrayList<>()); this.client = OkHttp.client(1000); - this.devices = new ArrayList<>(); + this.listener = listener; } public void start(List ips) { @@ -34,30 +35,44 @@ public class ScanTask { } public void start(String url) { - App.execute(() -> run(Arrays.asList(url))); + App.execute(() -> run(List.of(url))); + } + + public void stop() { + if (executor != null) executor.shutdownNow(); + executor = null; + listener = null; + } + + private void init() { + if (executor != null) executor.shutdownNow(); + executor = Executors.newFixedThreadPool(10); + devices.clear(); } private void run(List items) { try { + init(); getDevice(items); } catch (Exception e) { e.printStackTrace(); } finally { - App.post(() -> listener.onFind(devices)); + App.post(() -> { + if (listener != null) listener.onFind(devices); + }); } } private void getDevice(List urls) throws Exception { CountDownLatch cd = new CountDownLatch(urls.size()); - for (String url : urls) new Thread(() -> findDevice(cd, url)).start(); + for (String url : urls) executor.execute(() -> findDevice(cd, url)); cd.await(); } private List getUrl(List ips) { - LinkedHashSet urls = new LinkedHashSet<>(ips); - String local = Server.get().getAddress(); - String base = local.substring(0, local.lastIndexOf(".") + 1); - for (int i = 1; i < 256; i++) urls.add(base + i + ":9978"); + Set urls = new HashSet<>(ips); + String base = Server.get().getAddress().replaceAll("\\d+$", ""); + for (int i = 1; i < 256; i++) urls.add(base + i + ":" + 9978); return new ArrayList<>(urls); } diff --git a/catvod/src/main/java/com/github/catvod/net/OkProxySelector.java b/catvod/src/main/java/com/github/catvod/net/OkProxySelector.java index ad93c4421..f20ed57b9 100644 --- a/catvod/src/main/java/com/github/catvod/net/OkProxySelector.java +++ b/catvod/src/main/java/com/github/catvod/net/OkProxySelector.java @@ -13,7 +13,6 @@ import java.net.ProxySelector; import java.net.SocketAddress; import java.net.URI; import java.util.ArrayList; -import java.util.Collections; import java.util.List; public class OkProxySelector extends ProxySelector { @@ -39,9 +38,9 @@ public class OkProxySelector extends ProxySelector { @Override public List select(URI uri) { - if (proxy == null || hosts.isEmpty() || uri.getHost() == null || "127.0.0.1".equals(uri.getHost())) return Collections.singletonList(Proxy.NO_PROXY); - for (String host : hosts) if (Util.containOrMatch(uri.getHost(), host)) return Collections.singletonList(proxy); - return Collections.singletonList(Proxy.NO_PROXY); + if (proxy == null || hosts.isEmpty() || uri.getHost() == null || "127.0.0.1".equals(uri.getHost())) return List.of(Proxy.NO_PROXY); + for (String host : hosts) if (Util.containOrMatch(uri.getHost(), host)) return List.of(proxy); + return List.of(Proxy.NO_PROXY); } @Override