Ich habe an einer WP7-App gearbeitet, es ist eine Bildergalerie-App, mit grundlegenden Zoom-und Flick-Gesten implementiert.Kann das Speicherleck nicht finden
Für Testzwecke kompilierte ich die App mit Offline-Bildern (ihre Dateinamen sind nummeriert) auf Inhalt und Zugriff auf sie über hart codierte Zeichenfolge (die später ersetzt wird).
Aber kam zu der Erkenntnis, dass App eine Menge Speicher verbraucht. Ich dachte, es war aufgrund von Bildern und gefunden this blog; Bilder wurden immer zwischengespeichert. Ich habe den Code aus dem Blog verwendet, um dies zu korrigieren. Still-Speicher wird nicht freigegeben, obwohl die Verbrauchsrate gesunken ist.
Für letzten Versuch habe ich einen weiteren Test-App mit Grundzug 2-Taste für die Navigation und Bildsteuerung für Bilder, nur um sicher zu machen, es war nicht meine Geste Codes, die das Problem sein könnte.
Dies ist der XAML
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Image Grid.Row="0" x:Name="ImageHolder" Height="Auto" Width="Auto" Stretch="Uniform" Tap="image_Tap" />
<TextBlock x:Name="MemUsage" />
<StackPanel Grid.Row="1" Orientation="Horizontal">
<Button x:Name="PrevButton" Content="Prev" Width="240" Click="btnPrev_Click"/>
<Button x:Name="NextButton" Content="Next" Width="240" Click="btnNext_Click"/>
</StackPanel>
</Grid>
Das sind die CS-
Datei istconst int PAGE_COUNT = 42;
int pageNum = 0;
public MainPage()
{
InitializeComponent();
RefreshImage();
}
private void btnPrev_Click(object sender, RoutedEventArgs e)
{
pageNum = (PAGE_COUNT + pageNum - 1) % PAGE_COUNT; // cycle to prev image
RefreshImage();
}
private void btnNext_Click(object sender, RoutedEventArgs e)
{
pageNum = (PAGE_COUNT + pageNum + 1) % PAGE_COUNT; // cycle to next image
RefreshImage();
}
private void image_Tap(object sender, GestureEventArgs e)
{
RefreshTextData();
}
private void RefreshImage()
{
BitmapImage image = ImageHolder.Source as BitmapImage;
ImageHolder.Source = null;
if (image != null)
{
image.UriSource = null;
image = null;
}
ImageHolder.Source = new BitmapImage(new Uri("000\\image" + (pageNum + 1).ToString("D3") + ".jpg", UriKind.Relative));
RefreshTextData();
}
private void RefreshTextData()
{
MemUsage.Text = "Device Total Memory = " + (long)DeviceExtendedProperties.GetValue("DeviceTotalMemory")/(1024 * 1024)
+ "\nCurrent Memory Usage = " + (long)DeviceExtendedProperties.GetValue("ApplicationCurrentMemoryUsage")/(1024 * 1024)
+ "\nPeak Memory Usage = " + (long)DeviceExtendedProperties.GetValue("ApplicationPeakMemoryUsage")/(1024 * 1024);
}
Aber noch ist Speicherleck gibt und ich kann Punkt nicht stecken. Es fällt mir schwer, es zu finden. Speicherprofiler zeigt, dass ich viele Instanzen einer Zeichenfolge habe, und ich kann das nicht interpretieren.
Nur wenige Punkte:
- Ich habe Bilder in einem Ordner "000" und dem Namen "Bild ###". Derzeit habe ich Bilder mit Dateinamen von „image001“ auf „image042“
- Test-App einen Speicherbedarf von 6 MB hat, sobald er die erste Seite vollständig mit dem Bild zeigt, und nach fisrt Seitenwechseln steigt es auf fast 18-20 MB
- Folgeseitenwechsel Ergebnis einer allmählichen Zunahme der Speicher und dann schließlich abstürzen, wenn die Zahl der Bilder erlauben, sonst nach durch alle Bilder der Speicherverbrauch Radfahren ist konstant
- I JPG-Dateien mit ca. Dimension 1280 bin mit x 2000, zum Testen skaliere ich keine Bilder.
Erzeugen Sie einen zusätzlichen Thread für jedes angezeigte Bild, um es zu rendern? Sie haben 1918 Thread-Objekte herum. Das hört sich nicht gesund an. Finden Sie heraus, wie Sie die Threads erstellen und ordnungsgemäß terminieren, damit die zugeordneten Ressourcen, auf die von der Thread-Methode verwiesen wird, freigegeben werden können. –
@Alois, ich bin kein Profi, nur ein Hobby-Entwickler. Ich habe wirklich keine Ahnung, wo ich versehentlich Fäden erzeuge. Ich erstelle keine Threads explizit. Ich weiß nicht mal, ist das wirklich ein Problem. Was ich sagen kann ist, dass der gesamte Code meiner Beispiel-App angezeigt wird. Also vielleicht, wenn du es neu erstellen könntest, sieh es dir an. Wäre hilfreich. –