Ejecutar JavaScript dentro de un service en Android

Tengo una lógica de negocios escrita en JavaScript, este código se comparte con otras aplicaciones que no son de Android.

Cuál es la mejor manera de usar las funciones en este fragment de JavaScript desde un Servicio en Android.

AFAIK, hay 2 opciones?

  • V8 que está integrado en el WebView estándar y súper rápido, sin apnea adicional.
  • Rhino, ¿qué es complicado comenzar con Android?

Centrándome en V8 / Webview, cuando bash acceder al WebView, con cualquier function, obtengo;

All WebView methods must be called on the UI thread. Future versions of WebView may not support use on other threads. 

La advertencia se observa, ni siquiera funciona ahora. Cuando configuro el webviewclient, no obtengo nada luego de cargar una URL.

Mi pregunta está en 3 partes;

1) ¿Alguien ha tenido éxito al ejecutar javascript en una vista web sin un hilo de interfaz de usuario?

2) ¿Cómo obtengo los resultados de las funciones dentro de javascript? ¿La interfaz webview "addJavascriptInterface" admite cargar un parámetro y enviarlo de nuevo a Java?

3) Si cualquiera de los anteriores es imposible … supongo que iré a search a Rhino, cualquier consejo sería apreciado, solo he visto algunos blogs quejándose de problemas con respecto a ponerlo en funcionamiento en Android y preguntándose si existe una versión "ir a" para Android mantenida en alguna parte.

No pude encontrar nada con respecto a V8 desde el background de un service.

Terminé usando Rhino, sin embargo, una palabra de advertencia para cualquiera que siga mis pasos, es increíblemente lento.

Solo toma el contenedor de la última distribución oficial de Rhino desde https://developer.mozilla.org/en-US/docs/Rhino/Download_Rhino?networkingirectlocale=en-US&networkingirectslug=RhinoDownload

js.jar es lo que necesitas en el zip. js-14 es una versión compatible java 1.4 más grande que no necesita.

La integración fue muy sencilla, simplemente coloca el contenedor en tu carpeta de libs.

A continuación estoy raspando una página web usando javascript (convirtiendo los datos en json mejor formateado). Con el script parse.js que hice desde la carpeta de activos.

Rhino no viene con DOM, y env.js falla con los errores de stackoverflow. En general, diría que esta solución es lenta y no está bien soportada …

 public static void sync(Context context, ){ String url = BASE_URL; String html = Utils.inputStreamToString(Utils.getHTTPStream(url)); timeList.add(System.currentTimeMillis()); if(html == null){ Utils.logw("Could not get board list."); return; } String parsingCode = null; try { parsingCode = Utils.inputStreamToString(context.getAssets().open("parse.js")); } catch (IOException e) { Utils.logw("Could not get board parser js"); return; } // Create an execution environment. org.mozilla.javascript.Context cx = org.mozilla.javascript.Context.enter(); // Turn comstacktion off. cx.setOptimizationLevel(-1); try { // Initialize a variable scope with bindnings for // standard objects (Object, Function, etc.) Scriptable scope = cx.initStandardObjects(); ScriptableObject.putProperty( scope, "html", org.mozilla.javascript.Context.javaToJS(html, scope)); //load up the function cx.evaluateString(scope, parsingCode,"parseFunction", 1 , null); // Evaluate the script. Object result = cx.evaluateString(scope, "myFunction()", "doit:", 1, null); JSONArray jsonArray = new JSONArray(result.toString());