From d3c073fa9d34ad549fd9c4db0fae11df35895a83 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Thu, 1 Nov 2018 18:18:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=E9=98=BB=E5=A1=9E?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E5=8A=A0=E4=B8=8Aui=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E5=88=A4=E6=96=AD=EF=BC=8C=E5=9C=A8ui=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E6=97=B6=E4=BC=9A=E6=8A=9B=E5=87=BA=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=EF=BC=9A=20waitForPackage,=20waitForActivity,=20http?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E7=9A=84=E6=96=B9=E6=B3=95=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E5=8A=A0callback=E5=8F=82=E6=95=B0=E6=97=B6=20findOne(),=20unt?= =?UTF-8?q?ilFind()=E7=AD=89=20sleep()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- autojs/src/main/assets/modules/__globals__.js | 16 ++++++++++++++-- autojs/src/main/assets/modules/__http__.js | 3 +++ .../autojs/core/accessibility/UiSelector.java | 8 ++++++++ .../com/stardust/autojs/runtime/api/Dialogs.java | 1 - .../com/stardust/autojs/runtime/api/Images.java | 10 +++------- 5 files changed, 28 insertions(+), 10 deletions(-) diff --git a/autojs/src/main/assets/modules/__globals__.js b/autojs/src/main/assets/modules/__globals__.js index 794b7025..d285b362 100644 --- a/autojs/src/main/assets/modules/__globals__.js +++ b/autojs/src/main/assets/modules/__globals__.js @@ -9,7 +9,12 @@ module.exports = function(runtime, global){ global.log(text); } - global.sleep = runtime.sleep.bind(runtime); + global.sleep = function(t) { + if(ui.isUiThread()){ + throw new Error("不能在ui线程执行阻塞操作,请使用setTimeout代替"); + } + runtime.sleep(t); + } global.isStopped = function(){ return runtime.isStopped(); @@ -25,7 +30,6 @@ module.exports = function(runtime, global){ global.exit = runtime.exit.bind(runtime); - global.stop = global.exit; global.setClip = function(text){ @@ -47,6 +51,7 @@ module.exports = function(runtime, global){ } global.waitForActivity = function(activity, period){ + ensureNonUiThread(); period = period || 200; while(global.currentActivity() != activity){ sleep(period); @@ -54,12 +59,19 @@ module.exports = function(runtime, global){ } global.waitForPackage = function(packageName, period){ + ensureNonUiThread(); period = period || 200; while(global.currentPackage() != packageName){ sleep(period); } } + function ensureNonUiThread() { + if(ui.isUiThread()){ + throw new Error("不能在ui线程执行阻塞操作,请在子线程或子脚本执行,或者使用setInterval循环检测当前activity和package"); + } + } + global.random = function(min, max){ if(arguments.length == 0){ return Math.random(); diff --git a/autojs/src/main/assets/modules/__http__.js b/autojs/src/main/assets/modules/__http__.js index 4332e8c9..4a7e1bf7 100644 --- a/autojs/src/main/assets/modules/__http__.js +++ b/autojs/src/main/assets/modules/__http__.js @@ -40,6 +40,9 @@ module.exports = function(runtime, scope){ } http.request = function(url, options, callback){ + if(!callback && ui.isUiThread()){ + throw new Error("不能在ui线程执行网络操作,请加上回调函数的参数callback或在子线程执行"); + } var call = http.client().newCall(http.buildRequest(url, options)); if(!callback){ return wrapResponse(call.execute()); diff --git a/autojs/src/main/java/com/stardust/autojs/core/accessibility/UiSelector.java b/autojs/src/main/java/com/stardust/autojs/core/accessibility/UiSelector.java index c48192f1..3e215aa0 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/accessibility/UiSelector.java +++ b/autojs/src/main/java/com/stardust/autojs/core/accessibility/UiSelector.java @@ -140,6 +140,7 @@ public class UiSelector extends UiGlobalSelector { @ScriptInterface @NonNull public UiObjectCollection untilFind() { + ensureNonUiThread(); UiObjectCollection uiObjectCollection = find(); while (uiObjectCollection.empty()) { if (Thread.currentThread().isInterrupted()) { @@ -155,6 +156,13 @@ public class UiSelector extends UiGlobalSelector { return uiObjectCollection; } + private void ensureNonUiThread() { + if(Looper.myLooper() == Looper.getMainLooper()){ + // TODO: 2018/11/1 配置字符串 + throw new IllegalThreadStateException("不能在ui线程执行阻塞操作, 请在子线程或子脚本执行findOne()或untilFind()"); + } + } + @ScriptInterface public UiObject findOne(long timeout) { if (timeout == -1) { diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/Dialogs.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/Dialogs.java index ccc68af8..166e701e 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/Dialogs.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/Dialogs.java @@ -42,7 +42,6 @@ public class Dialogs { .showAndGet(); } - @ScriptInterface public Object alert(String title, String content, Object callback) { MaterialDialog.Builder builder = dialogBuilder(callback) diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/Images.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/Images.java index 4f28a30c..47099ad7 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/Images.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/Images.java @@ -9,7 +9,6 @@ import android.graphics.Matrix; import android.media.Image; import android.os.Build; import android.os.Handler; -import android.os.SystemClock; import android.support.annotation.RequiresApi; import android.util.Base64; import android.view.Display; @@ -18,10 +17,11 @@ import android.view.WindowManager; import com.stardust.autojs.annotation.ScriptVariable; import com.stardust.autojs.core.image.ColorFinder; import com.stardust.autojs.core.image.ImageWrapper; -import com.stardust.autojs.core.opencv.OpenCVHelper; +import com.stardust.autojs.core.image.TemplateMatching; import com.stardust.autojs.core.image.capture.ScreenCaptureRequester; import com.stardust.autojs.core.image.capture.ScreenCapturer; -import com.stardust.autojs.core.image.TemplateMatching; +import com.stardust.autojs.core.opencv.Mat; +import com.stardust.autojs.core.opencv.OpenCVHelper; import com.stardust.autojs.core.ui.inflater.util.Drawables; import com.stardust.autojs.runtime.ScriptRuntime; import com.stardust.autojs.runtime.exception.ScriptInterruptedException; @@ -29,8 +29,6 @@ import com.stardust.concurrent.VolatileDispose; import com.stardust.pio.UncheckedIOException; import com.stardust.util.ScreenMetrics; -import com.stardust.autojs.core.opencv.Mat; - import org.opencv.core.Point; import org.opencv.core.Rect; @@ -52,7 +50,6 @@ public class Images { private ScreenCaptureRequester mScreenCaptureRequester; private ScreenCapturer mScreenCapturer; private Context mContext; - private Display mDisplay; private Image mPreCapture; private ImageWrapper mPreCaptureImage; private ScreenMetrics mScreenMetrics; @@ -64,7 +61,6 @@ public class Images { mScriptRuntime = scriptRuntime; mScreenCaptureRequester = screenCaptureRequester; mContext = context; - mDisplay = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); mScreenMetrics = mScriptRuntime.getScreenMetrics(); colorFinder = new ColorFinder(mScreenMetrics); }