Flipboard / GoldenGate

An Android annotation processor for generating type safe javascript bindings (Bridges)
BSD 3-Clause "New" or "Revised" License
120 stars 19 forks source link

How to call method with JS callback #6

Open hosek opened 9 years ago

hosek commented 9 years ago

Hi, is possible to call method with JS callback? Example:

Library.prototype.fetch = function(url,cb,scope) {
        var request = new XMLHttpRequest();

    request.onreadystatechange = function() {
        if (request.readyState==4 && request.status==200) {
            cb.call(scope,request.responseText);
        }
    }
        request.open("GET",url,true);
        request.send();
}

In JS call looks like this:

instanceOfLibrary.fetch('_URL_', function(data) {document.getElementById("output").innerHTML = "<h2>Fetched:</h2><pre>"+data+"</pre>";

If yes, could I ask how to define the callback in interface?

@Method("instanceOfLibrary.fetch")
void fetch(String url, ???? , Callback<String> callback);

Thank you in advance for any hint!

emilsjolander commented 9 years ago

This is not currently possible but i'll look into adding it!

emilsjolander commented 9 years ago

There is still some work to be done on this but the current code in master introduces this feature.

hosek commented 9 years ago

Great job! Thank you for fast response. btw there is NPE for all interface calls now java.lang.NullPointerException: Attempt to invoke virtual method 'long java.util.concurrent.atomic.AtomicLong.incrementAndGet()' on a null object reference at com.flipboard.goldengate.sample.SampleBridge.getNavigator(SampleBridge.java:74)

emilsjolander commented 9 years ago

Thanks for the report, I'm still working on the code and will push an update soon and then to maven central shortly after that

emilsjolander commented 9 years ago

@hosek Try it now and see what you think, i'll publish it if it's what you expected :) Only limitation currently is that the callback can't return anything. This is something that we can add later imho

@Bridge
public interface Sample {

    @Method("[1,2,3,4,5,6,7,8,9,10].forEach")
    void looptyLoop(@JavascriptCallback Callback<Integer> val);

}
hosek commented 9 years ago

Seems fine! Thanks a lot. Callback return value is unfortunately important for me. I will look at you implementation and maybe try to add it by myself.

emilsjolander commented 9 years ago

@hosek that sounds good! I might have a look at it as well