fix: timer not working when script runs repeatedly

This commit is contained in:
hyb1996
2017-10-27 23:56:40 +08:00
parent 2c990e1966
commit 1f7be092d8
7 changed files with 109 additions and 18 deletions

View File

@@ -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 {

View File

@@ -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

View File

@@ -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();
}
}

View File

@@ -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;
}

View File

@@ -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;
}
}

View File

@@ -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;

View File

@@ -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) {