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.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 {
|
||||
|
||||
@@ -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<Object> 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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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<Thread, Looper> 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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user