0

I've got WebView, JS code inside it. Also I have interface to allow Java method invocation from WebView to Java code. I need to pass data from JS to Java. To do so:

webView.loadUrl("javascript:getData()");

//Obtain Java object here

In JavaScript:

function gataData () {
    //serialize data to JSON, pass it as 'native' function param
    JSInterface.setLocationsData(data);// This calls a Java function setLocationsData(String param)
}

In JavaScript interface(Java code):

 void setLocationsData(String param){
    //parse JSON here, create Java Object
 }

The problem is: I've got a delay between calling script in WebView after webView.loadUrl() and moment when data is returned to my Java code. Java code doesn't wait for JS to finish it's business. How do I solve this?

1 Answers1

2

The only (hacky) solution that I've come across is using a one second delay after calling the loadUrl. You may use the addJavaSriptInterface() to do so.

or if the JS processing takes too long you have to use callbacks

<input type="button" value="Say hello" onClick="callYourCallbackFunctionHere('Hello Android!')" />

<script type="text/javascript">
    function callYourCallbackFunctionHere(toast) {
        Android.callAndroidCallback(toast);
    }
</script>

public class JavaScriptInterface {
    Context mContext;

    /** Instantiate the interface and set the context */
    JavaScriptInterface(Context c) {
        mContext = c;
    }

    /** Show a toast from the web page */
    public void callAndroidCallback(String toast) {
        Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
    }
}
Community
  • 1
  • 1
Reno
  • 33,594
  • 11
  • 89
  • 102
  • I already have JSInterface, so I need to make a callback in it and to proceed in program only when that callback is called. Thanks for the answer. –  Oct 24 '11 at 07:02
  • how powerful is this solution? can we do full java <-> javascript communication using those methods or are there some important limitations? thanks! – xus Dec 28 '11 at 08:53