2010-08-15 6 views
6

Ich habe mehrere Ansätze ausprobiert, um eine einseitige native App mit Phonegap zu erstellen, und suche nach allgemeinen Hinweisen zur Fehlerbehebung.Speicherwarnungen/Absturz mit PhoneGap iPad App

Erster Ansatz: Es ist im Grunde eine Reihe von verschiedenen Seiten und Unterseiten mit Jquery in Container verladen, die auf der Indexseite leben. Es wird also keine Seite geladen, sondern nur Seitenfragmente von Seiten in eine Shell geladen, wobei .load() verwendet wird.

Zweiter Ansatz: Ich machte eine Ein-Seiten-HTML-Seite mit allen Inhalten, dann zeigen, und dass auf Anpassung die Klasse eines Navigationspunktes zu einem id eines Content-Container basierend verstecken.

Beide Ansätze funktionieren gut mechanisch. Das Problem scheint in der Tatsache zu liegen, dass alle meine Unterseiten eine Galerie oder 2-6 Bilder haben (also insgesamt über 215 Bilder, 660 x 440), für die ich jquery cycle verwendet habe, und Touchwipe zum Aktivieren des Scrollens mit Gesten. Die Galerien funktionieren gut, aber nach einigem Scrollen durch etwa 35 Galerien erhält die App immer eine Erinnerungswarnstufe 1, dann 2, dann stürzt sie ab. Meine Speicherbelegung in Instrumenten scheint in Ordnung zu sein ... die Ajax-geladene Fragment-Version bleibt etwa 2 Megabyte Live-Bytes, der Ein-Pager bleibt konstant bei etwa 5 Megabyte. Die Galerien bestehen aus CSS-Hintergrundbildern in Divs, da diese besser als Tags zu funktionieren schienen.

Ich sehe keine Speicherlecks oder wirklich irgendwelche anderen Probleme außerhalb der Speicherwarnungen. Ich merke, wie ich das aufspüren kann. Ich habe Versuch und Irrtum absolut zu Tode gemacht. Habe das Javascript auf das Wesentliche reduziert. Etwas scheint sich im Laufe der Zeit zu entwickeln.

Haben Sie Ideen, wie Sie herausfinden können, was vor sich geht? Gibt es einige erste Ansätze, um sicherzustellen, dass nichts mit dem Javascript passiert, das eine Art von Speicherleck verursacht?

Es ist sehr frustrierend, dass die ganze Sache ziemlich gut funktioniert, außer auf dem iPad.

Meine nächste Taktik könnte sein, zu versuchen, die Galerie Hintergrundbilder zu einem leeren GIF neu zu schreiben, wenn sie nicht verwendet werden.

Hier ist der Code, den ich für die Ein-Pager:

$(document).ready(function(){ 

    document.addEventListener('touchmove', function(e){ e.preventDefault(); }); 

    $('div#mainpages > div').hide(); 

    $("ul#mainnav li").click(function() { 
     $("#mainpages > div").hide(); 
     var navClass = $(this).attr('class'); 
     var target='#'+navClass; 
     $(target).show(); 
     $('[id^=subpages] > div').hide(); 
     $(target).find('[id^=subpages_] div:first').show(); 
    }); 


    $('[id^=subnav] li').click(function() { 

     $('[id^=subnav_] li').removeClass('current'); 
     $('[id^=subpages_] > div').hide(); 

     var subnavClass = $(this).attr('class'); 
     var subtargeted='#'+subnavClass; 
     $(subtargeted).show(); 

     $(this).addClass('current'); 

     $(subtargeted+' .gallery_div_shell').cycle({ 
      timeout: 0, 
      speed: 700, 
      speedIn: 300, 
      speedOut: 300, 
      fx: 'scrollHorz' 
     }); 

     $(subtargeted+' .gallery_div_shell').touchwipe({ 
      wipeLeft: function() { 
       $('.gallery_div_shell').cycle("next"); 
      }, 
      wipeRight: function() { 
       $('.gallery_div_shell').cycle("prev"); 
      } 
     }); 
    }); 
}); 

Vielen Dank für jede Beratung, ich meine Haare herausziehen.

Antwort

1

Auf den ersten Blick sehe ich nichts falsch. Sie könnten versuchen, explizit die jQuery-Cycle-Galerie zu zerstören, wenn Sie die nächsten öffnen und sehen, ob die

$(youridentifier).cycle('destroy'); 
+0

Danke für einen Blick, ich habe das auch versucht. Ich habe der aktuellen Galerie zuerst eine Klasse hinzugefügt, etwa ".active_gallery", dann zerstöre diese spezielle "cycle" -Galerie als erstes beim click -Ereignis der Navigation und entferne dann die Klasse, bevor ich den ganzen Code durchführe, der die neue aktuelle Fahrradgalerie. Hatte noch kein Glück damit. Es scheint egal, was passiert, nachdem es durch 35 Galerien gerutscht ist, fängt es an Erinnerungen zu erhalten. Mit der Ajax Loading App, bekomme ich das gleiche Ergebnis, auch nach dem Zerstören der Fahrrad-Galerien, Entfernen der "Wipe" Handler, etc. – Transoptic

2

helfen Ich denke, das Problem nicht auf Javascript verwendet war, sondern auf die Menge der Bilder webkit Zusammenhang kann in aktiv halten Erinnerung. Es scheint im Zusammenhang mit dieser Frage: Crashing when loading images

Meine Lösung war es, eine Kombination der dort genannten Dinge zu verwenden. Als erstes benutze ich divs mit einem Hintergrundbild für meine Galerien. Zweitens beginne ich mit allen Hintergrundbildern, die als leeres GIF gesetzt sind. Wenn ich einen Unterabschnitt zeige und eine Galerie aktiviere, benutze ich jquery, um das css-Hintergrundbild in die tatsächliche Bildquelle zu schreiben. Wenn ich dann auf einen neuen Unterlink klicke, setze ich ihn zurück, um das leere GIF zu verwenden. Dies scheint die Anzahl der "aktiven" div-Hintergrundbilder auf nur 3-7 auf einmal zu halten, abgesehen von der Schnittstelle gfx. Währenddessen sind die anderen 200 Divis mit Hintergrundbildern in Galerien (die sowieso nicht angezeigt werden) nur ein leeres Gif.

Ich denke, dass dieses Problem im Allgemeinen Einschränkungen in UIWebview, eher als etwas spezifisch für PhoneGap oder jquery verwandt ist. Ich bin nicht davon überzeugt, dass dies die endgültige Lösung ist, aber ich kann die App ohne Absturz so weit laufen lassen, und meine Live-Bytes im Allocations-Instrument bleiben konstant bei etwa 1,3 Megabyte.