2013-05-08 20 views
8

Ho una logica aziendale scritta in JavaScript, questo codice è condiviso con altre app non Android.Esecuzione di JavaScript all'interno di un servizio in Android

Qual è il modo migliore per utilizzare le funzioni in questo pezzo di JavaScript all'interno di un servizio in Android.

AFAIK, ci sono 2 opzioni?

  • V8 integrato nella visualizzazione Web standard e superveloce, senza ulteriore aumento di apk.
  • Rhino, che è difficile da usare su Android?

Concentrandosi su V8 ​​/ Webview, quando provo ad accedere a WebView, con qualsiasi funzione, ottengo;

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

L'avviso è stato notato, non funziona nemmeno ora. Quando imposto il webviewclient, non ottengo nulla dopo aver caricato un URL.

La mia domanda è in 3 parti;

1) Qualcuno ha avuto qualche successo con l'esecuzione di javascript in una visualizzazione Web senza un thread dell'interfaccia utente?

2) Come ottengo risultati dalle funzioni all'interno del javascript, l'interfaccia Webview "addJavascriptInterface" supporta il caricamento di un parametro e il suo invio a java?

3) Se uno di quanto sopra sono impossibili .. Credo Vado a prendere Rhino, qualche consiglio sarebbe apprezzato, ho visto solo un paio di blog che si lamentano dei problemi per quanto riguarda ottenere andando su Android e chiedendo se esiste una versione "go to" per Android mantenuta da qualche parte.

+0

Perché è stato downvoted. Ho fatto un sacco di sforzi per comprenderlo alla fine e sono sicuro che molti sviluppatori là fuori sono interessati ad usare un linguaggio script in Android ... –

risposta

6

Impossibile trovare nulla per quanto riguarda V8 da un servizio in fondo.

Finito usando Rhino, ma una parola di avvertimento a chiunque segua i miei passi, è incredibilmente lento.

solo afferrare il barattolo dal l'ultima distribuzione ufficiale di Rhino da https://developer.mozilla.org/en-US/docs/Rhino/Download_Rhino?redirectlocale=en-US&redirectslug=RhinoDownload

js.jar è quello che serve nello zip. js-14 è una versione di java 1.4 più grande di cui non hai bisogno.

L'integrazione è stata semplicissima, basta inserire il barattolo nella cartella delle librerie.

Di seguito viene visualizzata una pagina Web utilizzando javascript (trasformando i dati in JSON con formattazione migliore). Con lo script parse.js che ho creato provenendo dalla cartella delle risorse.

Rhino non viene fornito con DOM e env.js si arresta con errori di stackoverflow. Nel complesso, direi che questa soluzione è lenta e non ben supportata ...

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 compilation 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()); 
+1

Ciao, sono curioso di come sia lento. Puoi condividere alcuni risultati numerici che hai ottenuto? Grazie in anticipo. – yhpark

+1

Extreme, lo stavo usando per analizzare html. con qualcosa che richiederebbe il codice nativo, 1 o 2 secondi impiegherebbero 45 secondi per il rinoceronte. –

+1

@yhpark Sarebbe bello se si potesse passare la domanda in modo che altre persone non ritengano che questa sia una domanda non valida. Sono stato vittima di downvoting seriale e penso che se questa domanda e la risposta fosse utile, non dovrebbe sedersi con un negativo :) –