我们最近更改了Worklight连接设置,以使该应用程序不连接到Worklight Server。
进行此更改之后,显示本机页面(AppInit.js)的代码不再返回到JavaScript回调函数。
看来本机页面运行到最后,但是我对WL.Logger.log('backFromNativeLoginPage');
的调用未执行。它会挂在最后一个可见页面上,直到手机进入睡眠模式,然后由用户恢复,或者用户切换到主屏幕并切换回应用程序。之后,执行回调代码。
我还注意到LogCat中的一个条目,以前没有注意到:
线程警告:对Logger.LOG的exec()调用阻止了主线程
44毫秒。插件应使用CordovaInterface.getThreadPool()
使它正常工作的唯一方法是将connectOnStartup
设置为true
时。我不确定为什么它依赖于oreder中服务器的连接才能从本机页面返回?由于连接服务器不是我们的选择,因此有人知道是否有解决方法吗?有没有人见过这个?
这是我的代码:
AppInit.js
var showNativePage = function() {
WL.NativePage.show('com.app.Login', function(data) {
WL.Logger.log('backFromNativeLoginPage'); //Does not run if connectOnStartup=false
}, {param: 'some value'});
};
initOptions.js
var wlInitOptions = {
connectOnStartup: false //setting this to true works
};
WLJSX.bind(window, 'load', function() {
WL.Client.init(wlInitOptions);
});
Login.java
public class Login extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LoginWebViewClient client = new LoginWebViewClient(this);
webView = (WebView) findViewById(R.id.login);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(client);
webView.loadUrl(url);
}
public void setAppDataAndReturn(HashMap<String, String> dataList) {
Intent returnData = new Intent();
for (Map.Entry<String, String> item : dataList.entrySet()) {
returnData.putExtra(item.getKey(), item.getValue());
}
setResult(RESULT_OK, returnData);
finish();
}
}
更新:
在尝试了许多建议之后,我在Cordova events上遇到了一些文档,然后按照以下说明,通过将以下代码添加到我的AppInit.js文件中,终于使它可以工作:
function wlEnvInit() {
wlCommonInit();
document.addEventListener("deviceready", function(info) {
document.addEventListener("resume", function(e){ WL.Logger.log('Resume from native page.'); }, false);
});
}
我不完全确定为什么会这样,但是似乎
WL.Logger.log()
语句是必需的,因为没有它回调函数不会执行。如果有人能阐明为什么这种方式起作用,我很想知道。希望这种“解决方法”可以帮助可能遇到相同问题的人... 最佳答案
我看到您在initOptions.js中包含以下代码:
WLJSX.bind(window, 'load', function() {
WL.Client.init(wlInitOptions);
});
这会导致在浏览器(或混合应用程序中的Webview)中的
WL.Client.init
函数调用load
事件。 WL.Client.init
触发的代码路径下的某些可执行代码取决于是否完全初始化了Cordova。 connectOnStartup: true
指令触发一个代码路径,该路径取决于已经完全初始化的Cordova。 deviceready
事件指示了完整的Cordova初始化。您正在
WL.Client.init
事件之前触发deviceready
。因此,您会看到意外的行为。我强烈建议删除
load
事件绑定和回调代码,并将所有初始化代码放在wlCommonInit
或wlEnvInit
中,这是在deviceready
事件上触发的。您无需在代码中显式侦听deviceready
。关于javascript - IBM Worklight 6.1-如果处于脱机模式,则不会调用NativePage.show回调,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22157064/