fix: timer not working when script runs repeatedly
This commit is contained in:
@@ -6,6 +6,7 @@ import com.stardust.autojs.engine.JavaScriptEngine;
|
|||||||
import com.stardust.autojs.engine.ScriptEngine;
|
import com.stardust.autojs.engine.ScriptEngine;
|
||||||
import com.stardust.autojs.engine.ScriptEngineManager;
|
import com.stardust.autojs.engine.ScriptEngineManager;
|
||||||
import com.stardust.autojs.execution.ExecutionConfig;
|
import com.stardust.autojs.execution.ExecutionConfig;
|
||||||
|
import com.stardust.autojs.execution.LoopedBasedJavaScriptExecution;
|
||||||
import com.stardust.autojs.execution.RunnableScriptExecution;
|
import com.stardust.autojs.execution.RunnableScriptExecution;
|
||||||
import com.stardust.autojs.execution.ScriptExecuteActivity;
|
import com.stardust.autojs.execution.ScriptExecuteActivity;
|
||||||
import com.stardust.autojs.execution.ScriptExecution;
|
import com.stardust.autojs.execution.ScriptExecution;
|
||||||
@@ -130,7 +131,12 @@ public class ScriptEngineService {
|
|||||||
return ScriptExecuteActivity.execute(mContext, mScriptEngineManager, task);
|
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) {
|
if (task.getConfig().runInNewThread) {
|
||||||
new ThreadCompat(r).start();
|
new ThreadCompat(r).start();
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import android.os.MessageQueue;
|
|||||||
import com.stardust.autojs.runtime.api.Loopers;
|
import com.stardust.autojs.runtime.api.Loopers;
|
||||||
import com.stardust.autojs.script.JavaScriptSource;
|
import com.stardust.autojs.script.JavaScriptSource;
|
||||||
import com.stardust.autojs.script.ScriptSource;
|
import com.stardust.autojs.script.ScriptSource;
|
||||||
|
import com.stardust.util.Callback;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Stardust on 2017/7/28.
|
* Created by Stardust on 2017/7/28.
|
||||||
@@ -24,18 +25,27 @@ public class LoopBasedJavaScriptEngine extends RhinoJavaScriptEngine {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object execute(final JavaScriptSource source) {
|
public Object execute(final JavaScriptSource source) {
|
||||||
|
execute(source, null);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void execute(final ScriptSource source, final Callback<Object> callback) {
|
||||||
Runnable r = new Runnable() {
|
Runnable r = new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
LoopBasedJavaScriptEngine.super.execute(source);
|
Object o = LoopBasedJavaScriptEngine.super.execute((JavaScriptSource) source);
|
||||||
|
if (callback != null)
|
||||||
|
callback.call(o);
|
||||||
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
mHandler.post(r);
|
mHandler.post(r);
|
||||||
if (!mLooping && Looper.myLooper() != Looper.getMainLooper()) {
|
if (!mLooping && Looper.myLooper() != Looper.getMainLooper()) {
|
||||||
mLooping = true;
|
mLooping = true;
|
||||||
Looper.loop();
|
Looper.loop();
|
||||||
|
mLooping = false;
|
||||||
}
|
}
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -51,7 +51,7 @@ public class RunnableScriptExecution extends ScriptExecution.AbstractScriptExecu
|
|||||||
engine.init();
|
engine.init();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Object doExecution(ScriptEngine engine) {
|
protected Object doExecution(ScriptEngine engine) {
|
||||||
engine.setTag(ScriptEngine.TAG_SOURCE, getSource());
|
engine.setTag(ScriptEngine.TAG_SOURCE, getSource());
|
||||||
getListener().onStart(this);
|
getListener().onStart(this);
|
||||||
Object result = null;
|
Object result = null;
|
||||||
@@ -64,14 +64,19 @@ public class RunnableScriptExecution extends ScriptExecution.AbstractScriptExecu
|
|||||||
sleep(delay);
|
sleep(delay);
|
||||||
ScriptSource source = getSource();
|
ScriptSource source = getSource();
|
||||||
for (int i = 0; i < times; i++) {
|
for (int i = 0; i < times; i++) {
|
||||||
result = engine.execute(source);
|
result = execute(engine, source);
|
||||||
sleep(interval);
|
sleep(interval);
|
||||||
}
|
}
|
||||||
getListener().onSuccess(this, result);
|
getListener().onSuccess(this, result);
|
||||||
return 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) {
|
if (i <= 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import android.os.MessageQueue;
|
|||||||
import com.stardust.autojs.runtime.exception.ScriptInterruptedException;
|
import com.stardust.autojs.runtime.exception.ScriptInterruptedException;
|
||||||
import com.stardust.lang.ThreadCompat;
|
import com.stardust.lang.ThreadCompat;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -15,10 +14,15 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||||||
|
|
||||||
public class Loopers {
|
public class Loopers {
|
||||||
|
|
||||||
|
public interface LooperQuitHandler {
|
||||||
|
boolean shouldQuit();
|
||||||
|
}
|
||||||
|
|
||||||
public volatile boolean waitWhenIdle = false;
|
public volatile boolean waitWhenIdle = false;
|
||||||
private volatile Looper mServantLooper;
|
private volatile Looper mServantLooper;
|
||||||
private static volatile ConcurrentHashMap<Thread, Looper> sLoopers = new ConcurrentHashMap<>();
|
private static volatile ConcurrentHashMap<Thread, Looper> sLoopers = new ConcurrentHashMap<>();
|
||||||
private Timers mTimers;
|
private Timers mTimers;
|
||||||
|
private LooperQuitHandler mLooperQuitHandler;
|
||||||
|
|
||||||
public Loopers(Timers timers) {
|
public Loopers(Timers timers) {
|
||||||
mTimers = timers;
|
mTimers = timers;
|
||||||
@@ -29,8 +33,11 @@ public class Loopers {
|
|||||||
@Override
|
@Override
|
||||||
public boolean queueIdle() {
|
public boolean queueIdle() {
|
||||||
Looper l = Looper.myLooper();
|
Looper l = Looper.myLooper();
|
||||||
if (l != null && shouldQuitLooper())
|
if (l != null && shouldQuitLooper()) {
|
||||||
l.quit();
|
if (mLooperQuitHandler != null && mLooperQuitHandler.shouldQuit()) {
|
||||||
|
l.quit();
|
||||||
|
}
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -102,4 +109,8 @@ public class Loopers {
|
|||||||
if (looper != null)
|
if (looper != null)
|
||||||
looper.quit();
|
looper.quit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setLooperQuitHandler(LooperQuitHandler looperQuitHandler) {
|
||||||
|
mLooperQuitHandler = looperQuitHandler;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.stardust.autojs.runtime.api;
|
|||||||
|
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
|
import android.util.Log;
|
||||||
import android.util.SparseArray;
|
import android.util.SparseArray;
|
||||||
|
|
||||||
import com.stardust.autojs.runtime.ScriptBridges;
|
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();
|
ensureHandler();
|
||||||
mCallbackMaxId++;
|
mCallbackMaxId++;
|
||||||
final int id = mCallbackMaxId;
|
final int id = mCallbackMaxId;
|
||||||
|
|||||||
@@ -134,21 +134,21 @@ public class UiObject extends AccessibilityNodeInfoCompat {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public CharSequence text() {
|
public String text() {
|
||||||
CharSequence t = getText();
|
CharSequence t = getText();
|
||||||
return t == null ? "" : t;
|
return t == null ? "" : t.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public CharSequence desc() {
|
public String desc() {
|
||||||
return getContentDescription();
|
return getContentDescription().toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public CharSequence className() {
|
public String className() {
|
||||||
return getClassName();
|
return getClassName().toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public CharSequence packageName() {
|
public String packageName() {
|
||||||
return getPackageName();
|
return getPackageName().toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean performAction(int action, ActionArgument... arguments) {
|
public boolean performAction(int action, ActionArgument... arguments) {
|
||||||
|
|||||||
Reference in New Issue
Block a user