2016-09-05 13 views
3

私はJavaとJavascriptの間の通信に使用するJavascriptBridgeというクラスを持っています。ジャバスクリプトにコマンドを送信するwebView.evaluateJavascriptコールバックから値を返す方法は?

、私は単純に、この使用:

public void sendDataToJs(String command) { 
    webView.loadUrl("javascript:(function() { " + command + "})()"); 
} 

を私の問題は、私はまた、JavaScriptからの応答を返す関数が必要だろうということです。私はwebView.evaluateJavascriptを試していますが、evaluateJavascriptは別のスレッドで行われるため、コールバックはスキップされます。

public String getDataFromJs(String command, WebView webView) { 
    String data = null; 

    webView.evaluateJavascript("(function() { return " + command + "; })();", new ValueCallback<String>() { 
     @Override 
     public void onReceiveValue(String s) { 
      Log.d("LogName", s); // Print "test" 
      // data = s; // The value that I would like to return 
     } 
    }); 

    return data; // Return null, not "test" 
} 

メソッドの呼び出し:

String result = getDataFromJs("test", webView); // Should return "test" from the webView 

私も@JavascriptInterfaceを使用して試してみたが、それは同じ結果を与えます。

答えて

2

Android上で同期Javascriptを評価する方法は、ので、あなたの最善の策は、コールバックを待ち、その後evaluateJavascriptを使用することです(つまり、現在のスレッドに)ありません。

public void getDataFromJs(String command, WebView webView) { 
    webView.evaluateJavascript("(function() { return " + command + "; })();", new ValueCallback<String>() { 
     @Override 
     public void onReceiveValue(String s) { 
      returnDataFromJs(s); 
     } 
    }); 
} 

public returnDataFromJs(String data) { 
    // Do something with the result. 
} 

方法はありません現在のスレッドでJavascriptを評価するには、Javascript操作に時間がかかることがあります(JSエンジンがスピンアップするのに時間がかかる)ので、現在のスレッドをブロックできます。

関連する問題