0

我有一个循环,对于每个调用异步请求到服务器的项目,创建一个带有 webview 的视图,以便稍后在计算位置后添加一个滚动视图。在回调中,我获取服务器数据并提供给 webview。

当加载方法需要更长的时间来执行时(例如在慢速连接中),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 上运行。

4

1 回答 1

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 线程有关

于 2012-10-11T01:53:33.800 回答