diff --git a/app/src/main/java/com/github/catvod/net/OkHttp.java b/app/src/main/java/com/github/catvod/net/OkHttp.java index 895e54ec..a6d6e22c 100644 --- a/app/src/main/java/com/github/catvod/net/OkHttp.java +++ b/app/src/main/java/com/github/catvod/net/OkHttp.java @@ -16,6 +16,7 @@ import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; +import okhttp3.Call; import okhttp3.Dns; import okhttp3.Headers; import okhttp3.OkHttpClient; @@ -39,8 +40,8 @@ public class OkHttp { return Loader.INSTANCE; } - public static Response newCall(String url) throws IOException { - return client().newCall(new Request.Builder().url(url).build()).execute(); + public static Response newCall(String url, String tag) throws IOException { + return client().newCall(new Request.Builder().url(url).tag(tag).build()).execute(); } public static String string(String url) { @@ -90,6 +91,23 @@ public class OkHttp { return null; } + public static void cancel(String tag) { + cancel(client(), tag); + } + + public static void cancel(OkHttpClient client, String tag) { + for (Call call : client.dispatcher().queuedCalls()) if (tag.equals(call.request().tag())) call.cancel(); + for (Call call : client.dispatcher().runningCalls()) if (tag.equals(call.request().tag())) call.cancel(); + } + + public static void cancelAll() { + cancelAll(client()); + } + + public static void cancelAll(OkHttpClient client) { + client.dispatcher().cancelAll(); + } + private static OkHttpClient build() { if (get().client != null) return get().client; return get().client = getBuilder().build(); diff --git a/app/src/main/java/com/github/catvod/spider/Init.java b/app/src/main/java/com/github/catvod/spider/Init.java index 6de51f76..4c9b33e0 100644 --- a/app/src/main/java/com/github/catvod/spider/Init.java +++ b/app/src/main/java/com/github/catvod/spider/Init.java @@ -1,17 +1,10 @@ package com.github.catvod.spider; -import android.app.Activity; import android.app.Application; import android.content.Context; -import android.os.Bundle; import android.os.Handler; import android.os.Looper; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.github.catvod.crawler.SpiderDebug; - import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -19,7 +12,6 @@ public class Init { private final ExecutorService executor; private final Handler handler; - private Activity activity; private Application app; private static class Loader { @@ -39,18 +31,8 @@ public class Init { return get().app; } - public static Activity activity() { - return get().activity; - } - - private void setActivity(Activity activity) { - this.activity = activity; - } - public static void init(Context context) { get().app = ((Application) context); - SpiderDebug.log("自定義爬蟲代碼載入成功!"); - registerActivityLifecycleCallbacks(); Proxy.init(); } @@ -65,42 +47,4 @@ public class Init { public static void post(Runnable runnable, int delay) { get().handler.postDelayed(runnable, delay); } - - private static void registerActivityLifecycleCallbacks() { - get().app.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() { - @Override - public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) { - if (activity != activity()) get().setActivity(activity); - } - - @Override - public void onActivityStarted(@NonNull Activity activity) { - if (activity != activity()) get().setActivity(activity); - } - - @Override - public void onActivityResumed(@NonNull Activity activity) { - if (activity != activity()) get().setActivity(activity); - } - - @Override - public void onActivityPaused(@NonNull Activity activity) { - if (activity == activity()) get().setActivity(null); - } - - @Override - public void onActivityStopped(@NonNull Activity activity) { - if (activity == activity()) get().setActivity(null); - } - - @Override - public void onActivityDestroyed(@NonNull Activity activity) { - if (activity == activity()) get().setActivity(null); - } - - @Override - public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) { - } - }); - } } diff --git a/app/src/main/java/com/github/catvod/spider/Market.java b/app/src/main/java/com/github/catvod/spider/Market.java index f7fe7248..ed853915 100644 --- a/app/src/main/java/com/github/catvod/spider/Market.java +++ b/app/src/main/java/com/github/catvod/spider/Market.java @@ -1,6 +1,5 @@ package com.github.catvod.spider; -import android.app.ProgressDialog; import android.content.Context; import android.net.Uri; @@ -11,6 +10,7 @@ import com.github.catvod.bean.market.Item; import com.github.catvod.crawler.Spider; import com.github.catvod.net.OkHttp; import com.github.catvod.utils.FileUtil; +import com.github.catvod.utils.Notify; import com.github.catvod.utils.Path; import com.github.catvod.utils.Util; @@ -26,17 +26,8 @@ import okhttp3.Response; public class Market extends Spider { - private ProgressDialog dialog; + private static final String TAG = Market.class.getSimpleName(); private List datas; - private boolean busy; - - public boolean isBusy() { - return busy; - } - - public void setBusy(boolean busy) { - this.busy = busy; - } @Override public void init(Context context, String extend) throws Exception { @@ -60,34 +51,28 @@ public class Market extends Spider { @Override public String action(String action) { try { - if (isBusy()) return ""; - setBusy(true); - Init.post(this::setDialog, 500); - Response response = OkHttp.newCall(action); - File file = Path.create(new File(Path.download(), Uri.parse(action).getLastPathSegment())); - download(file, response.body().byteStream(), Double.parseDouble(response.header("Content-Length", "1"))); + OkHttp.cancel(TAG); + String name = Uri.parse(action).getLastPathSegment(); + Notify.show("正在下載..." + name); + Response response = OkHttp.newCall(action, TAG); + File file = Path.create(new File(Path.download(), name)); + download(file, response.body().byteStream()); if (file.getName().endsWith(".zip")) FileUtil.unzip(file, Path.download()); if (file.getName().endsWith(".apk")) FileUtil.openFile(file); - else Result.notify("下載完成"); checkCopy(action); response.close(); - dismiss(); - return ""; + return Result.notify("下載完成"); } catch (Exception e) { - dismiss(); return Result.notify(e.getMessage()); } } - private void download(File file, InputStream is, double length) throws Exception { + private void download(File file, InputStream is) throws Exception { try (BufferedInputStream input = new BufferedInputStream(is); FileOutputStream os = new FileOutputStream(file)) { - byte[] buffer = new byte[4096]; + byte[] buffer = new byte[16384]; int readBytes; - long totalBytes = 0; while ((readBytes = input.read(buffer)) != -1) { - totalBytes += readBytes; os.write(buffer, 0, readBytes); - setProgress((int) (totalBytes / length * 100.0)); } } } @@ -102,37 +87,8 @@ public class Market extends Spider { } } - private void setDialog() { - Init.post(() -> { - try { - dialog = new ProgressDialog(Init.activity()); - dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); - dialog.setCancelable(false); - if (isBusy()) dialog.show(); - } catch (Exception e) { - e.printStackTrace(); - } - }); - } - - private void dismiss() { - Init.post(() -> { - try { - setBusy(false); - if (dialog != null) dialog.dismiss(); - } catch (Exception e) { - e.printStackTrace(); - } - }); - } - - private void setProgress(int value) { - Init.post(() -> { - try { - if (dialog != null) dialog.setProgress(value); - } catch (Exception e) { - e.printStackTrace(); - } - }); + @Override + public void destroy() { + OkHttp.cancel(TAG); } } diff --git a/jar/custom_spider.jar b/jar/custom_spider.jar index c9237d09..b159e5c1 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 dc8a15f5..2c9b1e37 100644 --- a/jar/custom_spider.jar.md5 +++ b/jar/custom_spider.jar.md5 @@ -1 +1 @@ -fe1c0645034f7063eceec49e9c0f5c72 +c77efde41ebab1daf37308a1153d3f85