2014-09-14 20 views
5

Ich habe eine PhoneGap/JQuery MObile App, die Daten vom Server über Ajax abruft und sie als Liste anzeigt. Mit jedem Ajax-Abruf erhöht sich der von App belegte Speicher um ca. 10 MB. Beim ersten Abruf kann es OK sein, da eine große Anzahl von Datensätzen abgerufen wird (ca. 700). Bei späteren Anrufen verstehe ich jedoch, dass der Speicher erneut verwendet werden sollte, anstatt jedes Mal weitere 10 MB zu stapeln. Ich habe .off() verwendet, um Event-Handler freizugeben, falls sie den Speicher halten, aber keinen Erfolg.Speichernutzung in PhoneGap App

Hier ist die Hauptseite Div, wo die Ausgabe angezeigt wird:

<div data-role="content" class="MainContent" style="overflow:hidden; padding-top: 0px;"> 
    <ul data-divider-theme="b" data-role="listview" data-inset="true" class="MainMenu"> 

    </ul> 

Und das ist der Javascript-Code, der die Daten vom Server und zeigt in der obigen div abruft.

AjaxFile = "mydomai.com/ajax.php"; 
$.get(AjaxFile, function (AjaxData) { 

    $(".PL").off(); 
    $(".MainMenu").off(); 
    $(".MainContent").off(); 

    AjaxData = '<li class="MainMenuList" data-role=list-divider>' + gTitle + AjaxData; 
    $(".MainMenu").empty(); 
    $(".MainMenu").html(AjaxData); 
    $(".MainMenu").listview('refresh'); 
    window.scrollTo(0, 0); 
    $.mobile.loading('hide'); 

    HighlightRow(gCurrentFile); 
    $(document).ready(function() { 
     $(".PL").click(function() { 
      if (!$(this).hasClass("BTitleRow")) 
      { 
       $(".PL").removeClass("RowHighlight"); 
       $(this).addClass("RowHighlight"); 
       OpenNewLink($(this).attr('name')); 
      } 
     }); 
    }); 

}); 

AjaxData = null; 
return; 

Kann mir bitte jemand sagen, wie kann ich den Speicher frei zu machen und sicherzustellen, dass der gleiche Speicher statt häufen sich mehr und mehr Speicher wiederverwendet wird.

Vielen Dank.

========= UPDATE ===========

Auch wenn ich unten Teil zu entfernen, kann ich immer noch die Speicherauslastung sehen klettern:

Es scheint eine Art von Speicherleck in Ajax sowie Listview ("Refresh"). Kann mir bitte jemand helfen? Danke

+0

Hat Ihre Liste viele Bilder? –

+0

Nein, die Liste enthält keine Symbole. – Anjum

+0

Versuchen Sie in Ihrem jQuery.ajax ({}) "cache: false" hinzuzufügen. BTW, wie berechnen/wissen Sie, dass es rund 10 MB Speicher verwendet? Bcoz ist es neu für mich und ich möchte wissen, danke –

Antwort

-2

Probieren Sie dies aus, es wird fangen fangen, wenn Ihre App startet. Ich weiß, das ist jetzt, was Sie eigentlich wollen, aber es könnte Ihnen helfen ..

super.clearCache(); // just add This Line 
super.loadUrl("file:///android_asset/www/index.html"); 
+0

Dies ist eine Java-Sache; nicht wahr? Und ich verwende kein Java.Sein rein JavaScript verwendet JQuery Mobile. – Anjum

+0

@Anjum Ja, Sie müssen es nur in der Java-Datei Ihrer Activity hinzufügen, die Sie in Ihrem src-Ordner in Eclipse finden. (in meinem Fall src -> com.app.example -> MainActivity.java) Und Sie erwähnen, dass Sie phonegap verwenden, also, wenn Sie phonegap App in Eclipse erstellen, finden Sie in src Ordner –

+1

Nein, ich benutze nicht Eclipse . Ich verwende einen einfachen Texteditor (Notepad ++), um den Quellcode zu pflegen. – Anjum

1

Die Schuld ist nicht Ihr Code. Es ist jQuery, die lieben, Speicher zu essen Ich sehe oft ein Verhältnis von 4 zwischen einem reinen javascript und einer jQuery-Anwendung in Speicherconsomption.

Entweder verwenden Sie jQuery nicht für kritische Teile in Ihrer mobilen Entwicklung, oder Sie verwenden jQuery nicht mehr für Ihre mobilen Apps (das mache ich), entweder verwenden Sie http://plugins.jquery.com/cache/ und leeren den Speicher von Zeit zu Zeit Zeit.

BR

+0

Danke. Werde das Plugin ausprobieren. – Anjum

2

nicht eine vollständige Antwort, aber wenn Sie die Webapp in Chrome laufen können (so außerhalb von Phonegap) können Sie die Javascript-Profiler verwenden könnten einen Heap Snapshot zu nehmen, um herauszufinden, wo der Speicher verwendet wird.

Wenn Sie innerhalb von Phonegap laufen müssen, aber ein Android-Gerät haben, ist es auch möglich, den Chrome-Debugger zu verbinden, und mit etwas Hacking ist es auch möglich, iOS-Geräte und/oder Simulatoren zu verbinden.

+0

Danke. Ja, ich kann Ripple Emulate ausführen, um es im Browser auszuführen. Sprechen Sie über dieses: https://developer.mozilla.org/en-US/docs/Tools/Profiler – Anjum

+0

Nein meinte ich Haufen Profiling, sehen Sie hier: https://developer.chrome.com/devtools/docs/ Haufenprofilierung –