Optimize scan task

pull/589/head
FongMi 1 year ago
parent f863623867
commit eed819fd15
  1. 12
      app/src/mobile/java/com/fongmi/android/tv/ui/dialog/CastDialog.java
  2. 14
      app/src/mobile/java/com/fongmi/android/tv/ui/dialog/SyncDialog.java
  3. 47
      app/src/mobile/java/com/fongmi/android/tv/utils/ScanTask.java
  4. 7
      catvod/src/main/java/com/github/catvod/net/OkProxySelector.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) {
}

@ -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();
}
}

@ -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<Device> 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<String> 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<String> 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<String> 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<String> getUrl(List<String> ips) {
LinkedHashSet<String> 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<String> 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);
}

@ -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<Proxy> 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

Loading…
Cancel
Save