我为每个调用服务器的异步请求的项目循环,创建一个带有webview的视图,以便稍后在计算位置后添加一个scrollview。在回调中,我获取服务器数据并提供给webview。
当load方法执行时间稍长时(例如,在慢速连接中),不会呈现webview。
这种情况在设备中多次发生,但在模拟器中很少发生。但是,要轻松模拟,只需在load方法中放置一个断点,从而延迟执行。 我怀疑渲染已添加的webview时出现问题。
我将代码简化为一个块以便更好地理解:
function createView(){
var view = Ti.UI.createView({
//...
});
var webview = Ti.UI.createWebView({});
view.add(webview);
//Callback to process webview content after receive the server data
view.load = function(serverData){
webview.setUrl(serverData.url);
webview.addEventListener('beforeload', function(){
webview.evalJS("var value="+serverData.value+";");
});
};
return view;
};
var views = new Array();
for(i=0;i < data.length;i++){
views[i] = createView();
//Async request to server
var req = Ti.Network.createHTTPClient();
req.onload = function(){
result = JSON.parse(this.responseText);
views[i].load(result);
}
req.open("POST", "http://myserver.com.br/myservice");
req.send({myParam: data[i].value});
}
var scrollView = Ti.UI.createScrollView({
//...
});
for(i=0;i < views.length;i++){
//Calc the positions, not relevant
views[i].width = calculedValue;
views[i].height = calculedValue;
scrollView.add(views[i]);
}
win.add(scrollView);
我正在使用Titanium SDK 1.8.2并在带有iOS 5.0.1的iPad 2上运行。
答案 0 :(得分:1)
我解决了在回调而不是在事件监听器上评估javascript数据的问题
view.load = function(serverData){
webview.setUrl(serverData.url);
//Not on event 'beforeload'
//webview.addEventListener('beforeload', function(){ not on
webview.evalJS("var value="+serverData.value+";");
//});
};
我认为这与UI线程有时在事件监听器
上没有被调用有关