Android Phonegap:当AsyncTask完成时通知javascript
Android Phonegap: Notify javascript when an AsyncTask is finished
在我的应用程序中,当用户点击webview中的按钮时,将调用phonegap插件来触发从互联网下载文件的asynctask。现在我想在asynctask完成时发送一个信号回javascript部分。但我不知道如何做到这一点,因为我的插件已经在asynctask完成之前发送了一些东西。有没有人知道我如何通知我的javascript部分没有插件在Phonegap?
我也在Phonegap谷歌群里问过这个问题,下面是Simon Mac Donald的回答。它非常适合我:
你可以很容易地使用Plugin API来处理这种情况。它在核心API项Connection和Battery中实现。你需要做的是:
1)在你的插件的execute()方法中保存你得到的callbackId。
2)返回NO_RESULT插件结果并设置keep回调id为true。
PluginResult pluginResult = new PluginResult(PluginResult.Status.NO_RESULT);
pluginResult.setKeepCallback(true);
return pluginResult;
3)当你的异步java方法完成返回另一个插件结果,像这样:
PluginResult result = new PluginResult(PluginResult.Status.OK, data);
result.setKeepCallback(false);
this.success(result, this.myCallbackId);
正如我所说的,你可以看看GitHub中的代码,看看我们是如何将其用于连接和电池的。
我就是这样解决你这样的问题的。
1)创建并关联一个JavascriptInterface到你的WebView。JavascriptInterface只是一个类,你可以在里面声明一些你想在JS中使用的Java方法。
public class JSInterface() {
private final CountDownLatch latch = new CountDownLatch(1);
public void waitForProceed() {
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void canProceed() {
latch.countDown();
}
}
2)在你的AsyncTask中,在onPostExecute()
方法的末尾,你必须调用canProceed()
方法来通知JSInterface它可以退出waitForProceed()
方法。
public class MyAsyncTask extends AsyncTask<.......> {
private JSInterface jsi;
... // other class property
public MyAsyncTask(JSInterface jsi) {
...
//do what you want with other class property
this.jsi = jsi;
}
@Override
public ... doInBackground(...) {
...
//do something
}
@Override
public void onPostExecute(...) {
...
//do something
jsi.canProceed();
}
}
3)在你的活动中,你必须将JSInterface对象关联到你的WebView:
WebView mWebView;
...
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new JSInterface(), "JSIface");
4)最后,在JS中,您可以调用AsyncTask(我不知道您如何调用它,但我猜您使用类似JSInterface的东西),然后调用waitForProceed()
方法:
startAsyncTask(); //somehow
JSIface.waitForProceed();
我希望这能解决你的问题。
下面是一个详细的例子:
让我们创建一些接口,当AsyncTask
将完成的东西,也就是当onPostExecute
调用。
在我的例子中,我们获取一些JSONArray
数据
MyTaskListenerItf.java
public interface GroupTaskListenerItf {
public void onTaskDone(JSONArray groupArray);
}
的
AsyncTask
模板如下:
MyBuildTask.java
public class MyBuildTask extends AsyncTask<Void, Void, SomeData>{
private MyTaskListenerItf mTl = null;
public MyBuildTask(Context context, MyTaskListenerItf tl) {
super();
this.mContext = context;
this.mTl = tl;
}
@Override
protected SomeData doInBackground(Void... params) {
/* ... */
}
@Override
protected void onPostExecute(WmTransferItem transferItem) {
// ...
if(this.mTl != null){
JSONArray data = new JSONArray("");
this.mTl.onTaskDone(data);
}
// ..
}
}
那么现在我们的CordovaPlugin
类应该是这样的:
MyCordovaPlugin.java
public class MyCordovaPlugin extends CordovaPlugin implements GroupTaskListenerItf {
// we need this callback when Task will finish
private CallbackContext mMyCallbackContext = null;
@Override
public boolean execute(String action, JSONArray args,CallbackContext callbackContext) throws JSONException {
if("runMe".equals(action)){
final GroupTaskListenerItf gt = this;
mMyCallbackContext = callbackContext;
// pass our 'GroupTaskListenerItf' interface to async class
MyBuildTask task = new MyBuildTask(cordova.getActivity(), gt);
task.execute();
PluginResult pluginResult = new PluginResult(PluginResult.Status.NO_RESULT);
pluginResult.setKeepCallback(true);
callbackContext.sendPluginResult(pluginResult);
}
else{
this.cordova.getThreadPool().execute( new Runnable() {
public void run() {
// BTW, here you might run something else out of UI Thread
}
});
}
}
/* ... */
@Override
public void onTaskDone(JSONArray data) {
if (this.mGroupCallbackContext != null) {
PluginResult result = new PluginResult(PluginResult.Status.OK, data);
result.setKeepCallback(false);
this.mMyCallbackContext.sendPluginResult(result);
}
}
。
希望对大家有所帮助。
- 如何在自动完成时设置属性标题
- Adobe Edge:动画完成时添加onComplete处理程序
- 当一些事情可以通过JS或CSS完成时,我应该选择哪种方式
- 当send_data完成时,Rails send_data和Javascript处理程序
- 如何在uploadify/uploadifive中使用OnQueueComplete事件在队列完成时发送电子邮件
- 在操作完成时执行函数
- Knockout Force在设置新值时通知订阅者可观察到的值
- JQuery AJAX 在 GET 请求完成时返回 XML
- fadeIn仅在未显示且fadeOut完成时显示
- 当数据库中的表发生更改时通知用户
- 是否有任何事件“;在$scope摘要完成时”;或“;在视图刷新时”;在Angular.js中
- 当所有表单字段都完成时,jquery将图像添加到列表项中一次
- 当用户名和传递请求通过ajax完成时,我如何重定向页面
- 当视频停止或播放完成时,谷歌SWFObject javascript检测
- Javascript:对象在自动完成时应出现错误
- rel=“prerender” load event?预呈现完成时通知用户
- Javascript能告诉JavaFX生成一个线程并在完成时得到通知吗
- 主干事件聚合器-当所有事件处理程序完成处理时通知
- Android Phonegap:当AsyncTask完成时通知javascript
- 发布/订阅完成时通知