2012-04-24 39 views
0

我正在爲Android開發一個html應用程序,我試圖在列表視圖中加載圖像。特定於列表項的數據由多個xml文件提供。我使用ajax來加載xml文件並填充列表項。我在這裏面臨的問題是有164個列表項目。因此,需要加載164個圖像和10個xml文件。我的加載函數在兩次迭代後耗盡。它確實讀取了xml文件,但它無法動態創建列表項並在兩次迭代後用圖像填充它們。我相信這是由於堆棧限制。我想不出替代解決方案。如果有人可以建議備用解決方案,將高度讚賞。以下是我的加載函數。這是一個遞歸函數:在由多個xml文件提供的列表視圖中加載多個圖像時遇到困難

function loadChannels() { 

     $.ajax({ 
      type: "GET", 
      url: curURL, 
      dataType: "xml", 
      error: function(){ console.log('Error Loading Channel XML'); }, 
      success: function(nXml) { 
       var noOfItems = parseInt($($(nXml).find('total_items')[0]).text(), 10); 
       var startIdx = parseInt($($(nXml).find('item_startidx')[0]).text(), 10); 

       var allItems = $(nXml).find('item'); 


       $(allItems).each(function() { 
        var obj = $("<li><span id='cont-thumb'></span><span id='cont-name'></span></li>"); 
        $("#content-scroller ul").append($(obj)); 

        var imgURL = $($(this).find('item_image')[0]).text(); 
        var contThumb = $(obj).children()[0]; 
        $(contThumb).css("background-image", 'url('+imgURL+')'); 
        var name = $($(this).find('name')[0]).text(); 
        var contName = $(obj).children()[1]; 
        $(contName).text(name).css('text-align', 'center'); 
        var url = $($(this).find('link')[0]).text(); 
        $(obj).data('item_link', url); 
        $(obj).bind('click', onJPContSelected);     
       }); 

       if(startIdx+allItems.length < noOfItems){ 

        var newIdx = new Number(startIdx+allItems.length); 
        var tokens = curURL.split("/"); 
        tokens[tokens.length-2] = newIdx.toString(10); 
        curURL = "http:/"; 
        for(var i=2; i<tokens.length; i++) 
         curURL = curURL + "/" + tokens[i]; 

        loadChannels(); 
       } 
      } 
     }); 
    } 
+0

我甚至嘗試使用定時器來控制這種行爲,但無濟於事。它只能從164中加載20張圖片。我真的不明白髮生了什麼。任何快速的幫助將不勝感激。 – fz300 2012-04-24 14:11:21

回答

1

嘗試與外環刪除遞歸 - 類似的東西:

function loadChannels(){ 
    var stopFlag = false; 
    // request the pages one after another till done 
    while(!stopFlag) 
    { 
     $.ajax({ 
      type: "GET", 
      url: curURL, 
      dataType: "xml", 
      error: function(){ 
       console.log('Error Loading Channel XML'); 
       errorFlaf = true; 
      }, 
      success: function(nXml) { 
       var noOfItems = parseInt($($(nXml).find('total_items')[0]).text(), 10); 
       var startIdx = parseInt($($(nXml).find('item_startidx')[0]).text(), 10); 
       var allItems = $(nXml).find('item'); 
       $(allItems).each(function() { 
        var obj = $("<li><span id='cont-thumb'></span><span id='cont-name'></span></li>"); 
        $("#content-scroller ul").append($(obj)); 

        var imgURL = $($(this).find('item_image')[0]).text(); 
        var contThumb = $(obj).children()[0]; 
        $(contThumb).css("background-image", 'url('+imgURL+')'); 
        var name = $($(this).find('name')[0]).text(); 
        var contName = $(obj).children()[1]; 
        $(contName).text(name).css('text-align', 'center'); 
        var url = $($(this).find('link')[0]).text(); 
        $(obj).data('item_link', url); 
        $(obj).bind('click', onJPContSelected);     
       }); 

       if(startIdx+allItems.length < noOfItems){ 

        var newIdx = new Number(startIdx+allItems.length); 
        var tokens = curURL.split("/"); 
        tokens[tokens.length-2] = newIdx.toString(10); 
        curURL = "http:/"; 
        for(var i=2; i<tokens.length; i++) 
         curURL = curURL + "/" + tokens[i]; 

        // lets disable the recursion 
        // loadChannels(); 
       } 
       else { 
        stopFlag = true; 
       } 
      } 
     });   
    } 
} 
+0

嗨Yuvi,感謝您的快速回復。由於AJAX調用是異步的,因此添加外部循環會導致循環運行無限次。我試圖用定時器來控制遞歸,但這也不起作用。我認爲這與堆有關,因爲我得到了以下控制檯消息:dalvikvm-heap(19807):爲3850256字節的分配增加堆(碎片情況)到11.130MB – fz300 2012-04-25 06:25:00

+0

看起來像這個問題是特定於HoneyComb的。冰淇淋三明治和GingerBread正確呈現HTML內容。 – fz300 2012-04-25 12:17:52

+0

順便說一句:ajax可以設置爲沒有異步 - 我的意思是一個接一個的頁面 – Yuvi 2012-04-26 23:07:38