From 1f7be092d870c0583b2b23db895446a62744f371 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Fri, 27 Oct 2017 23:56:40 +0800 Subject: [PATCH] fix: timer not working when script runs repeatedly --- .../stardust/autojs/ScriptEngineService.java | 8 ++- .../engine/LoopBasedJavaScriptEngine.java | 14 ++++- .../LoopedBasedJavaScriptExecution.java | 58 +++++++++++++++++++ .../execution/RunnableScriptExecution.java | 11 +++- .../stardust/autojs/runtime/api/Loopers.java | 17 +++++- .../stardust/autojs/runtime/api/Timers.java | 3 +- .../java/com/stardust/automator/UiObject.java | 16 ++--- 7 files changed, 109 insertions(+), 18 deletions(-) create mode 100644 autojs/src/main/java/com/stardust/autojs/execution/LoopedBasedJavaScriptExecution.java diff --git a/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java b/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java index 16b6785d..605e7dd8 100644 --- a/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java +++ b/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java @@ -6,6 +6,7 @@ import com.stardust.autojs.engine.JavaScriptEngine; import com.stardust.autojs.engine.ScriptEngine; import com.stardust.autojs.engine.ScriptEngineManager; import com.stardust.autojs.execution.ExecutionConfig; +import com.stardust.autojs.execution.LoopedBasedJavaScriptExecution; import com.stardust.autojs.execution.RunnableScriptExecution; import com.stardust.autojs.execution.ScriptExecuteActivity; import com.stardust.autojs.execution.ScriptExecution; @@ -130,7 +131,12 @@ public class ScriptEngineService { return ScriptExecuteActivity.execute(mContext, mScriptEngineManager, task); } } - RunnableScriptExecution r = new RunnableScriptExecution(mScriptEngineManager, task); + RunnableScriptExecution r; + if (source instanceof JavaScriptSource) { + r = new LoopedBasedJavaScriptExecution(mScriptEngineManager, task); + } else { + r = new RunnableScriptExecution(mScriptEngineManager, task); + } if (task.getConfig().runInNewThread) { new ThreadCompat(r).start(); } else { diff --git a/autojs/src/main/java/com/stardust/autojs/engine/LoopBasedJavaScriptEngine.java b/autojs/src/main/java/com/stardust/autojs/engine/LoopBasedJavaScriptEngine.java index b3ef23b9..3a44dc82 100644 --- a/autojs/src/main/java/com/stardust/autojs/engine/LoopBasedJavaScriptEngine.java +++ b/autojs/src/main/java/com/stardust/autojs/engine/LoopBasedJavaScriptEngine.java @@ -8,6 +8,7 @@ import android.os.MessageQueue; import com.stardust.autojs.runtime.api.Loopers; import com.stardust.autojs.script.JavaScriptSource; import com.stardust.autojs.script.ScriptSource; +import com.stardust.util.Callback; /** * Created by Stardust on 2017/7/28. @@ -24,18 +25,27 @@ public class LoopBasedJavaScriptEngine extends RhinoJavaScriptEngine { @Override public Object execute(final JavaScriptSource source) { + execute(source, null); + return null; + } + + + public void execute(final ScriptSource source, final Callback callback) { Runnable r = new Runnable() { @Override public void run() { - LoopBasedJavaScriptEngine.super.execute(source); + Object o = LoopBasedJavaScriptEngine.super.execute((JavaScriptSource) source); + if (callback != null) + callback.call(o); + } }; mHandler.post(r); if (!mLooping && Looper.myLooper() != Looper.getMainLooper()) { mLooping = true; Looper.loop(); + mLooping = false; } - return null; } @Override diff --git a/autojs/src/main/java/com/stardust/autojs/execution/LoopedBasedJavaScriptExecution.java b/autojs/src/main/java/com/stardust/autojs/execution/LoopedBasedJavaScriptExecution.java new file mode 100644 index 00000000..411bcdef --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/execution/LoopedBasedJavaScriptExecution.java @@ -0,0 +1,58 @@ +package com.stardust.autojs.execution; + +import android.os.MessageQueue; +import android.util.Log; + +import com.stardust.autojs.engine.LoopBasedJavaScriptEngine; +import com.stardust.autojs.engine.ScriptEngine; +import com.stardust.autojs.engine.ScriptEngineManager; +import com.stardust.autojs.runtime.api.Loopers; +import com.stardust.autojs.script.JavaScriptSource; +import com.stardust.autojs.script.ScriptSource; + +/** + * Created by Stardust on 2017/10/27. + */ + +public class LoopedBasedJavaScriptExecution extends RunnableScriptExecution { + + public LoopedBasedJavaScriptExecution(ScriptEngineManager manager, ScriptExecutionTask task) { + super(manager, task); + } + + + protected Object doExecution(final ScriptEngine engine) { + engine.setTag(ScriptEngine.TAG_SOURCE, getSource()); + getListener().onStart(this); + long delay = getConfig().delay; + sleep(delay); + final LoopBasedJavaScriptEngine javaScriptEngine = (LoopBasedJavaScriptEngine) engine; + final long interval = getConfig().interval; + javaScriptEngine.getRuntime().loopers.setLooperQuitHandler(new Loopers.LooperQuitHandler() { + long times = getConfig().loopTimes == 0 ? Integer.MAX_VALUE : getConfig().loopTimes; + + @Override + public boolean shouldQuit() { + times--; + if (times > 0) { + sleep(interval); + javaScriptEngine.execute(getSource()); + return false; + } + javaScriptEngine.getRuntime().loopers.setLooperQuitHandler(null); + getListener().onSuccess(LoopedBasedJavaScriptExecution.this, null); + return true; + } + }); + javaScriptEngine.execute( + + getSource()); + return null; + } + + @Override + public JavaScriptSource getSource() { + return (JavaScriptSource) super.getSource(); + } + +} diff --git a/autojs/src/main/java/com/stardust/autojs/execution/RunnableScriptExecution.java b/autojs/src/main/java/com/stardust/autojs/execution/RunnableScriptExecution.java index 4f460148..bc9ff9bf 100644 --- a/autojs/src/main/java/com/stardust/autojs/execution/RunnableScriptExecution.java +++ b/autojs/src/main/java/com/stardust/autojs/execution/RunnableScriptExecution.java @@ -51,7 +51,7 @@ public class RunnableScriptExecution extends ScriptExecution.AbstractScriptExecu engine.init(); } - private Object doExecution(ScriptEngine engine) { + protected Object doExecution(ScriptEngine engine) { engine.setTag(ScriptEngine.TAG_SOURCE, getSource()); getListener().onStart(this); Object result = null; @@ -64,14 +64,19 @@ public class RunnableScriptExecution extends ScriptExecution.AbstractScriptExecu sleep(delay); ScriptSource source = getSource(); for (int i = 0; i < times; i++) { - result = engine.execute(source); + result = execute(engine, source); sleep(interval); } getListener().onSuccess(this, result); return result; } - private void sleep(long i) { + @SuppressWarnings("unchecked") + protected Object execute(ScriptEngine engine, ScriptSource source) { + return engine.execute(source); + } + + protected void sleep(long i) { if (i <= 0) { return; } diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/Loopers.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/Loopers.java index 1685f2b9..6bff0dcf 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/Loopers.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/Loopers.java @@ -6,7 +6,6 @@ import android.os.MessageQueue; import com.stardust.autojs.runtime.exception.ScriptInterruptedException; import com.stardust.lang.ThreadCompat; -import java.lang.reflect.Field; import java.util.concurrent.ConcurrentHashMap; /** @@ -15,10 +14,15 @@ import java.util.concurrent.ConcurrentHashMap; public class Loopers { + public interface LooperQuitHandler { + boolean shouldQuit(); + } + public volatile boolean waitWhenIdle = false; private volatile Looper mServantLooper; private static volatile ConcurrentHashMap sLoopers = new ConcurrentHashMap<>(); private Timers mTimers; + private LooperQuitHandler mLooperQuitHandler; public Loopers(Timers timers) { mTimers = timers; @@ -29,8 +33,11 @@ public class Loopers { @Override public boolean queueIdle() { Looper l = Looper.myLooper(); - if (l != null && shouldQuitLooper()) - l.quit(); + if (l != null && shouldQuitLooper()) { + if (mLooperQuitHandler != null && mLooperQuitHandler.shouldQuit()) { + l.quit(); + } + } return true; } }); @@ -102,4 +109,8 @@ public class Loopers { if (looper != null) looper.quit(); } + + public void setLooperQuitHandler(LooperQuitHandler looperQuitHandler) { + mLooperQuitHandler = looperQuitHandler; + } } diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/Timers.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/Timers.java index bd747811..c480a892 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/Timers.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/Timers.java @@ -2,6 +2,7 @@ package com.stardust.autojs.runtime.api; import android.os.Handler; import android.os.SystemClock; +import android.util.Log; import android.util.SparseArray; import com.stardust.autojs.runtime.ScriptBridges; @@ -28,7 +29,7 @@ public class Timers { } } - public int setTimeout(final Object callback, long delay, final Object... args) { + public int setTimeout(final Object callback, final long delay, final Object... args) { ensureHandler(); mCallbackMaxId++; final int id = mCallbackMaxId; diff --git a/automator/src/main/java/com/stardust/automator/UiObject.java b/automator/src/main/java/com/stardust/automator/UiObject.java index c7a95563..0da339af 100644 --- a/automator/src/main/java/com/stardust/automator/UiObject.java +++ b/automator/src/main/java/com/stardust/automator/UiObject.java @@ -134,21 +134,21 @@ public class UiObject extends AccessibilityNodeInfoCompat { } @NonNull - public CharSequence text() { + public String text() { CharSequence t = getText(); - return t == null ? "" : t; + return t == null ? "" : t.toString(); } - public CharSequence desc() { - return getContentDescription(); + public String desc() { + return getContentDescription().toString(); } - public CharSequence className() { - return getClassName(); + public String className() { + return getClassName().toString(); } - public CharSequence packageName() { - return getPackageName(); + public String packageName() { + return getPackageName().toString(); } public boolean performAction(int action, ActionArgument... arguments) {