Titanium - 由异步回调加载时不呈现Webview

时间:2012-04-13 02:26:02

标签: asynchronous webview titanium-mobile

我为每个调用服务器的异步请求的项目循环,创建一个带有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上运行。

1 个答案:

答案 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线程有时在事件监听器

上没有被调用有关