2013-05-08 57 views
8

我有用JavaScript編寫的業務邏輯,此代碼與其他非Android應用程序共享。在Android中的服務中運行JavaScript

什麼是在Android的Service中使用這段JavaScript中的函數的最佳方式。

AFAIK,有2個選項?

  • V8內置於標準WebView中,超快速,沒有額外的apk膨脹。
  • 犀牛,這是棘手的Android?

關注V8/Webview,當我嘗試訪問WebView時,使用任何函數,我都會得到;

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

警告被注意到,它現在甚至不起作用。當我設置webviewclient時,加載一個URL後我什麼也沒有得到。

我的問題是3部分;

1)有沒有人在沒有UI線程的情況下在webview中運行javascript的成功?

2)如何從javascript中的函數得到結果,webview接口「addJavascriptInterface」是否支持加載參數並將其發送回java? 3)如果上面的任何一個都不可能......我想我會去犀牛,任何提示將不勝感激,我只看到一些博客抱怨有關在Android上實現它的問題,想知道是否有一個「去」版本的Android維護的地方。

+0

爲什麼這會降低投票率。我花了很多精力來弄清楚這到底是什麼,我相信很多開發人員都有興趣在Android中使用腳本語言... – 2013-08-18 12:53:13

回答

6

無法從服務內容中找到與V8相關的任何內容。

結束了使用犀牛,但任何人跟隨我的腳步警告的話,這是令人難以置信的緩慢。

隨意在犀牛官方最新的分佈從 https://developer.mozilla.org/en-US/docs/Rhino/Download_Rhino?redirectlocale=en-US&redirectslug=RhinoDownload

js.jar罐子是你在zip需要什麼。 js-14是一個更大的java 1.4兼容版本,你不需要。

集成很簡單,只需將jar文件夾入libs文件夾即可。

下面是我用javascript(將數據轉換爲更好的格式化的json)刮取網頁。使用來自assets文件夾的parse.js腳本。

Rhino沒有附帶DOM,並且env.js崩潰時出現了stackoverflow錯誤。總的來說,我會說這個解決方案很慢並且支持得不好......

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

嗨,我很好奇它有多慢。你能分享一些你得到的數字結果嗎?提前致謝。 – yhpark 2013-09-22 07:03:25

+1

極端,我用它來解析html。有些東西需要原生代碼,1到2秒對於犀牛來說需要45秒。 – 2013-09-22 07:54:03

+1

@yhpark如果你能夠提出問題以便其他人不認爲這是一個無效問題,那將是非常好的。我是連續downvoting的受害者,我認爲如果這個問題和答案是有用的,它不應該坐在一個否定:) – 2013-09-22 08:23:51