package com.stardust.autojs.execution; import android.util.Log; import com.stardust.autojs.ScriptEngineService; import com.stardust.autojs.engine.RhinoJavaScriptEngine; import com.stardust.autojs.engine.ScriptEngine; import com.stardust.autojs.runtime.ScriptRuntime; import com.stardust.autojs.script.ScriptSource; /** * Created by Stardust on 2017/5/1. */ public class RunnableScriptExecution extends ScriptExecution.AbstractScriptExecution implements ScriptExecution, Runnable { private static final String TAG = "RunnableScriptExecution"; private ScriptEngine mScriptEngine; private ScriptRuntime mScriptRuntime; private ScriptEngineService mScriptEngineService; public RunnableScriptExecution(ScriptEngineService service, ScriptExecutionTask task) { super(task); mScriptEngineService = service; } @Override public void run() { execute(); } public Object execute() { mScriptEngine = mScriptEngineService.createScriptEngine(); mScriptRuntime = mScriptEngineService.createScriptRuntime(); return execute(mScriptRuntime, mScriptEngine); } private Object execute(ScriptRuntime runtime, ScriptEngine engine) { try { prepare(runtime, engine); return doExecution(engine); } catch (Exception e) { e.printStackTrace(); getListener().onException(this, e); } finally { Log.d(TAG, "Engine destroy"); engine.destroy(); } return null; } private void prepare(ScriptRuntime runtime, ScriptEngine engine) { if ((getSource().getExecutionMode() & ScriptSource.EXECUTION_MODE_AUTO) != 0) { runtime.ensureAccessibilityServiceEnabled(); } engine.put("__runtime__", runtime); engine.setTag("__require_path__", getConfig().getRequirePath()); engine.init(); } private Object doExecution(ScriptEngine engine) { engine.setTag("script", getSource()); getListener().onStart(this); Object result = engine.execute(getSource()); getListener().onSuccess(this, result); return result; } @Override public ScriptEngine getEngine() { return mScriptEngine; } @Override public ScriptRuntime getRuntime() { return mScriptRuntime; } }