关于CallbackContext中的sendPluginResult方法的作用
一般情况下我们编写的插件方法只需要返回一次结果值,比如对蓝牙可用性的判断:
private void bluetoothEnable() {
if (bleAdapter.isEnabled()) {
callbackContext.success("蓝牙可用");
} else {
callbackContext.error("蓝牙不可用");
}
}
但是有一种情况需要注意,比如在做一个搜索附近蓝牙的插件,由于结果不是一次性给出的,可能每隔一会儿才能搜索到一个可用的蓝牙设备,需要把每一次搜索到的蓝牙设备信息传递给JS层,如果通过callbackContext.success()方法进行重复调用则会引发错误且无法完成结果的传递,通过查看源码可以发现:
public void sendPluginResult(PluginResult pluginResult) {
synchronized (this) {
if (finished) {
LOG.w(LOG_TAG, "Attempted to send a second callback for ID: " + callbackId + "\nResult was: " + pluginResult.getMessage());
return;
} else {
finished = !pluginResult.getKeepCallback();
}
}
webView.sendPluginResult(pluginResult, callbackId);
}
当我们直接调用success或error方法返回结果给JS层时,最终调用的方法为sendPluginResult,pluginResult.getKeepCallback()方法获取的是keepCallback的值,它的默认值为false,因此通过以上方法只能实现一次结果的返回,当第二次调用的时keepCallback的值就已经被设置为true,继而会在控制台打印如下警告:Attempted to send a second callback for ID...并直接return。
因此如果我们想要向JS层多次返回结果时就需要将keepCallback的值手动设置为true,通过以下方法可完成结果的多次返回操作:
PluginResult pluginResult = new PluginResult(PluginResult.Status.OK,"message");
pluginResult.setKeepCallback(true);
callbackContext.sendPluginResult(pluginResult);