2016-09-05 2 views
3

그래서 Java와 Javascript 사이에서 통신하는 데 사용하는 JavascriptBridge이라는 클래스가 있습니다. webView.evaluateJavascript 콜백에서 값을 반환하는 방법은 무엇입니까?

는 단순히 이것을 사용, 자바 스크립트에 명령을 보내려면

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

내 문제는 내가 또한 자바 스크립트에서 응답을 반환하는 기능을해야한다는 것입니다. 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를 사용하여 시도했지만,이 같은 결과를 제공합니다.

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. 
} 

방법이 없습니다 :

답변

2

그래서 가장 좋은 건 다음 콜백 대기 evaluateJavascript을 사용하는 것입니다 동기 안드로이드 (즉, 현재의 thread에)에 자바 스크립트를 평가하는 방법이 아니다 Javascript 작업에 시간이 걸릴 수 있으므로 (JS 엔진이 스핀 업하는 데 시간이 필요함) 현재 스레드에서 자바 스크립트를 평가하면 현재 스레드를 차단할 수 있습니다.

관련 문제