2013-05-08 23 views
8

Mam logikę biznesową, która jest napisana w JavaScript, ten kod jest udostępniany innym aplikacjom innych niż android.Uruchamianie JavaScript w ramach usługi w Androidzie

Jaki jest najlepszy sposób korzystania z funkcji w tym kodzie JavaScript z poziomu usługi w systemie Android.

AFAIK, masz 2 możliwości?

  • V8 wbudowany w standardowy WebView i superszybki, bez dodatkowych naddatków.
  • Nosorożec, który jest trudny do uruchomienia w systemie Android?

Koncentrując się na V8/Webview, gdy próbuję uzyskać dostęp do WebView, z dowolną funkcją, otrzymuję;

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

Odnotowane ostrzeżenie, nawet teraz nie działa. Kiedy ustawiam Webviewclient, nie otrzymuję nic po załadowaniu adresu URL.

Moje pytanie składa się z trzech części;

1) Czy ktoś miał jakieś sukcesy z uruchomieniem javascript w widoku sieci bez wątku interfejsu użytkownika?

2) W jaki sposób uzyskać wyniki z funkcji wewnątrz javascript, czy interfejs Webview "addJavascriptInterface" obsługuje ładowanie parametru i wysyłanie go z powrotem do java?

3) Jeśli jedno z powyższych jest niemożliwe .. Chyba pójdę po Rhino, wszelkie wskazówki będą mile widziane, widziałem tylko kilka blogów narzekających na problemy związane z uruchomieniem Androida zastanawiasz się, czy istnieje wersja "idź do" dla Androida utrzymywanego gdzieś.

+0

Dlaczego zostało to odrzucone. Włożyłem dużo wysiłku, aby to sobie wyobrazić i jestem pewien, że wielu programistów jest zainteresowanych używaniem skryptowego języka w Androidzie ... –

Odpowiedz

6

Nie można znaleźć niczego w odniesieniu do V8 z poziomu usługi.

Skończyło się na tym, że używasz Rhino, ale słowo ostrzeżenia dla każdego, kto podąża moimi śladami, jest niesamowicie wolne.

Wystarczy chwycić słoik z oficjalnej dystrybucji najnowszej Rhino z https://developer.mozilla.org/en-US/docs/Rhino/Download_Rhino?redirectlocale=en-US&redirectslug=RhinoDownload

js.jar jest to, czego potrzebujesz w zip. js-14 to większa wersja kompatybilna z Javą 1.4, której nie potrzebujesz.

Integracja była bardzo prosta, wystarczy wsunąć plik jar do folderu libs.

Poniżej przedstawiono skrobanie strony za pomocą javascript (przekształcanie danych w lepiej sformatowany json). Za pomocą skryptu parse.js wykonałem przechodzenie z folderu asset.

Rhino nie pochodzi z DOM, a env.js zawiesza się z błędami stackoverflow. Ogólnie rzecz biorąc, powiedziałbym, że to rozwiązanie jest powolne i nie jest dobrze obsługiwane ...

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

Cześć, jestem ciekawa, jak powolna jest. Czy możesz podzielić się wynikami liczbowymi? Z góry dziękuję. – yhpark

+1

Extreme, użyłem go do parsowania html. z czymś, co wymagałoby natywnego kodu, 1 do 2 sekund zajęłoby 45 sekund dla nosorożca. –

+1

@ yhpark byłoby wspaniale, gdybyś mógł odpowiedzieć na to pytanie, aby inni ludzie nie uważali tego za nieważne. Byłem ofiarą seryjnego dezaprobowania i myślę, że gdyby to pytanie i odpowiedź były użyteczne, to nie powinno siedzieć z negatywem :) –