2

I think I'm missing something here. I'm used to sending data from javascript to java and back with calls to execute and back with the callbackContext methods.

But if at some points, lets say I have a running thread that needs to send data to the javascript at regular intervals, how should I do that then ? (This assumes that this task is running and has not been triggered by a javascript action, thus no callbackContext is available)

2
  • Which platform(s) does your plugin support? Commented Dec 1, 2014 at 1:25
  • For now, only android. I hope to support ios as well in the coming months Commented Dec 1, 2014 at 12:43

2 Answers 2

4

You can always execute javascript from java doing this:

String js = "alert('test')";
webView.loadUrlNow("javascript:" + js);

Or you can init the plugin and keep the callback doing this

PluginResult pgRes = new PluginResult(PluginResult.Status.OK, "message");
pgRes.setKeepCallback(true);
callbackContext.sendPluginResult(pgRes);

Added example provided by Sephy

private String myCbkId;
// Store callbackId from a call to execute 
@Override public boolean execute(String action, JSONArray arr, CallbackContext cbkCtx) throws JSONException { 

    myCbkId = cbkCtx.getCallbackId(); 
    JSONObject data = arr.getJSONObject(0); 
    String ack = data.getString("data"); // You can acknowledge to the callback for instance and keep it alive 
    Log.d(TAG, "ack".equals(ack) ? "ack !" : "not ack !");

    // These lines can be reused anywhere in your app to send data to the javascript
    PluginResult result = new PluginResult(PluginResult.Status.OK, ack);
    result.setKeepCallback(true);//This is the important part that allows executing the callback more than once, change to false if you want the callbacks to stop firing  
    this.webView.sendPluginResult(result, this.myCbkId); 

    return true; 
}
Sign up to request clarification or add additional context in comments.

8 Comments

Yeah that's kinda what I ended doing but this needs some explaining and more details for people who come accross this answer to get the point. I'll publish my solution later to compare it to yours.
Which one needs more explanation? first one is trivial, is the way you execute javascript from java. Second part maybe needs some explanation, but your question was vague too, it seemed you just needed orientation, you didn't ask for a complete example
Here is my complete solution. If it's ok with you to publish it in your answer as a more detailled version, I'll check your answer. Thanks for the pointer !
// Store callbackId from a call to execute @Override public boolean execute(String action, JSONArray arr, CallbackContext cbkCtx) throws JSONException { myCbkId = cbkCtx.getCallbackId(); JSONObject data = arr.getJSONObject(0); String ack = data.getString("data"); // You can acknowledge to the callback for instance and keep it alive Log.d(TAG, "ack".equals(ack) ? "ack !" : "not ack !");
// These lines can be reused anywhere in your app to send data to the javascript PluginResult result = new PluginResult(PluginResult.Status.OK, ack); result.setKeepCallback(true); this.webView.sendPluginResult(result, this.myCbkId); return true; }
|
0

If what you need is communication from server to client in asynchronous way than websockets are the solution for you. Exact implementation depends on which web server you use so you'd net to give more details but they all work same way more or less.

3 Comments

I'm not sure you got my issue well, I'm trying to talk between my java plugin and my web application wrapped with cordova...I'm not trying to do HTTP/WS communication.
Didn't see this one before you mention it, thx. But 1) it's a bi outdated as off Cordova 3, some things changed with plugins. 2) This question is not really clear to me and does not provide a clear and generic solution to reuse when you want to communicate from java to js with Cordova/Phonegap. If I understand it well, it mainly explains how to communicate from js to java, which I already know how to do.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.