diff --git a/app/src/main/java/com/github/catvod/api/AliYun.java b/app/src/main/java/com/github/catvod/api/AliYun.java index d8066fc5..6202c958 100644 --- a/app/src/main/java/com/github/catvod/api/AliYun.java +++ b/app/src/main/java/com/github/catvod/api/AliYun.java @@ -68,9 +68,10 @@ public class AliYun { private final ReentrantLock lock; private final Cache cache; + private MultiThreadedDownloader downloader; private ScheduledExecutorService service; - private AlertDialog dialog; private String refreshToken; + private AlertDialog dialog; private Share share; private static class Loader { @@ -515,7 +516,9 @@ public class AliYun { if (thread == 1) { return new Object[]{ProxyVideo.proxy(downloadUrl, headers)}; } else { - return new Object[]{new MultiThreadedDownloader(downloadUrl, headers, thread).start()}; + if (downloader != null) downloader.destory(); + downloader = new MultiThreadedDownloader(downloadUrl, headers, thread); + return new Object[]{downloader.start()}; } } diff --git a/app/src/main/java/com/github/catvod/utils/MultiThread.java b/app/src/main/java/com/github/catvod/utils/MultiThread.java index 08d2bf5d..510bb6b8 100644 --- a/app/src/main/java/com/github/catvod/utils/MultiThread.java +++ b/app/src/main/java/com/github/catvod/utils/MultiThread.java @@ -6,8 +6,6 @@ import java.net.URLEncoder; import java.util.Map; import java.util.TreeMap; -import fi.iki.elonen.NanoHTTPD; - public class MultiThread { public static String url(String url, int thread) { @@ -20,8 +18,7 @@ public class MultiThread { Map headers = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); for (String key : params.keySet()) headers.put(key, params.get(key)); MultiThreadedDownloader downloader = new MultiThreadedDownloader(url, removeHeaders(headers), thread); - NanoHTTPD.Response response = downloader.start(); - return new Object[]{response}; + return new Object[]{downloader.start()}; } private static Map removeHeaders(Map headers) { diff --git a/app/src/main/java/com/github/catvod/utils/MultiThreadedDownloader.java b/app/src/main/java/com/github/catvod/utils/MultiThreadedDownloader.java index fd5271a9..5099c76f 100644 --- a/app/src/main/java/com/github/catvod/utils/MultiThreadedDownloader.java +++ b/app/src/main/java/com/github/catvod/utils/MultiThreadedDownloader.java @@ -5,6 +5,7 @@ import static fi.iki.elonen.NanoHTTPD.newFixedLengthResponse; import android.os.SystemClock; import com.github.catvod.net.OkHttp; +import com.github.catvod.spider.Init; import java.io.PipedInputStream; import java.io.PipedOutputStream; @@ -12,6 +13,8 @@ import java.util.HashMap; import java.util.Locale; import java.util.Map; import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; @@ -27,6 +30,7 @@ public class MultiThreadedDownloader { //已开始下载的 chunk 队列 private final BlockingQueue readyChunkQueue; private final Map headers; + private final ExecutorService executor; private final String url; private final Lock lock; //最多缓存多少个未被取走的chunk @@ -54,6 +58,7 @@ public class MultiThreadedDownloader { this.numThreads = numThreads; this.lock = new ReentrantLock(); this.readyChunkQueue = new LinkedBlockingQueue<>(); + this.executor = Executors.newFixedThreadPool(numThreads); } //开始下载 @@ -125,7 +130,7 @@ public class MultiThreadedDownloader { //开启多线程下载 running = true; for (int i = 0; i < numThreads; ++i) { - new Thread(MultiThreadedDownloader.this::worker).start(); + executor.execute(this::worker); } //构造response @@ -140,7 +145,7 @@ public class MultiThreadedDownloader { } //搬运数据流 - new Thread(() -> { + Init.execute(() -> { try { while (true) { byte[] buffer = read(); @@ -159,7 +164,7 @@ public class MultiThreadedDownloader { e.printStackTrace(); } } - }).start(); + }); return mResponse; } @@ -194,6 +199,9 @@ public class MultiThreadedDownloader { private void worker() { while (running) { + //打斷技能 + if (Thread.interrupted()) break; + //生成下一个chunk Chunk chunk = null; lock.lock(); @@ -268,6 +276,11 @@ public class MultiThreadedDownloader { running = false; } + public void destory() { + running = false; + executor.shutdownNow(); + } + private static class Chunk { private final long startOffset; @@ -283,7 +296,7 @@ public class MultiThreadedDownloader { return buffer; } - public void put(byte[] buffer) throws InterruptedException { + public void put(byte[] buffer) { this.buffer = buffer; } } diff --git a/jar/custom_spider.jar b/jar/custom_spider.jar index 5d4b964c..80f45f8e 100644 Binary files a/jar/custom_spider.jar and b/jar/custom_spider.jar differ diff --git a/jar/custom_spider.jar.md5 b/jar/custom_spider.jar.md5 index 97d5b3bd..0ce31d01 100644 --- a/jar/custom_spider.jar.md5 +++ b/jar/custom_spider.jar.md5 @@ -1 +1 @@ -9060b67dfec8782aca6e79ba17c0979b +b298a8b958138c4e48aa0858886e7880