0

Ich habe einige andere Beiträge zu diesem Thema ausgecheckt, aber habe die Antwort, die ich suche, noch nicht gefunden. Ich versuche, die Speichernutzung in einigen Xamarin Android-Anwendungen zu bewerten und bin ziemlich verwirrt über das Thema geworden.Xamarin Android-Speicher - Instanzen im strikten Modus = 2; Limit = 1

Zu meinem eigenen Vorteil verwende ich die grundlegendste App, die ich für diesen ersten Test verwenden kann. Es gibt zwei Aktivitäten. Die erste Aktivität hat eine Schaltfläche, die die zweite Aktivität startet. Ich klicke dann auf den Hardware-Zurück-Button und gehe zurück zur ersten Aktivität. Ich poste den Code, aber das ist alles.

Ich habe hinzugefügt:

 var builder = new StrictMode.VmPolicy.Builder(); 
     var policy = builder.DetectActivityLeaks().PenaltyLog().Build(); 
     StrictMode.SetVmPolicy(policy); 

Innerhalb des OnCreate meiner beiden Aktivitäten Verstöße zu versuchen und zu sehen, oder wenn die Aktivitäten sind undicht. Was ich beobachtet Überstunden ich die Zurück-Taste aus der zweiten Aktivität klicken, erhalte ich eine Konsolenausgabe

[StrictMode] Klasse md5774612d1059550a86887b889cb974a69.SecondActivity; Instanzen = 2; limit = 1 [StrictMode] android.os.StrictMode $ InstanceCountViolation: Klasse md5774612d1059550a86887b889cb974a69.SecondActivity; Instanzen = 2; limit = 1 [StrictMode] bei android.os.StrictMode.setClassInstanceLimit (StrictMode.java:1)

Dies wird auch weiterhin „Instanzen“ erhöhen, jedes Mal, wenn ich die nächste Aktivität laden und drücken Sie erneut die Zurück-Taste. Ich verstehe nicht, warum es mehrere Instanzen gibt. Ist es nur, weil der Müllsammler sich nicht die Zeit genommen hat, die vorherigen Aktivitäten aufzuräumen? Oder habe ich wirklich ein Speicherleck von Aktivitäten selbst in dieser einfachen Anwendung? Wenn ich System.GC.Collect() in OnResume der Bildschirme aufrufen, sehe ich die Mehrfachinstanzverletzungen nicht mehr. Natürlich möchte ich dem Müllsammler nicht sagen, wann er seinen Job machen soll. Wenn das Problem nur darin besteht, dass es noch nicht dazu gekommen ist, denke ich, dass das in Ordnung ist? Aber gibt es bessere Praktiken, die ich befolgen sollte, um sicherzustellen, dass meine Aktivitäten den gesamten Speicher freigeben? Danke für irgendeinen Rat.

Code für die beiden folgenden Aktivitäten.

using Android.App; 
using Android.Widget; 
using Android.OS; 
using Android.Content; 

namespace Test.Droid 
{ 
[Activity (Label = "Test.Droid", MainLauncher = true, Icon = "@mipmap/icon")] 
public class MainActivity : Activity 
{ 
    int count = 1; 

    protected override void OnCreate (Bundle savedInstanceState) 
    { 
     base.OnCreate (savedInstanceState); 

     var builder = new StrictMode.VmPolicy.Builder(); 
     var policy = builder.DetectActivityLeaks().PenaltyLog().Build(); 
     StrictMode.SetVmPolicy(policy); 
     // Set our view from the "main" layout resource 
     SetContentView (Resource.Layout.Main); 

     // Get our button from the layout resource, 
     // and attach an event to it 
     Button button = FindViewById<Button> (Resource.Id.myButton); 

     button.Click += delegate { 
      Intent intent = new Intent(this, typeof(SecondActivity)); 
      StartActivity(intent); 
     }; 
    } 

    protected override void OnResume() 
    { 
     base.OnResume(); 
     //System.GC.Collect(); 
    } 
} 
} 

Zweite Aktivität

using System; 
using Android.App; 
using Android.Widget; 
using Android.OS; 
namespace Test.Droid 
{ 
[Activity(Label = "Test.Droid")] 
public class SecondActivity : Activity 
{ 
    int count = 1; 

    public SecondActivity() 
    { 

    } 

    protected override void OnCreate(Bundle savedInstanceState) 
    { 

     base.OnCreate(savedInstanceState); 

     var builder = new StrictMode.VmPolicy.Builder(); 
     var policy = builder.DetectActivityLeaks().PenaltyLog().Build(); 
     StrictMode.SetVmPolicy(policy); 

     // Set our view from the "main" layout resource 
     SetContentView(Resource.Layout.Main); 

     // Get our button from the layout resource, 
     // and attach an event to it 
     Button button = FindViewById<Button>(Resource.Id.myButton); 

     button.Click += delegate 
     { 
      button.Text = string.Format("{0} clicks!", count++); 
     };  } 

} 
} 

Antwort

0

Sie können die nicht gesetzt Aktivitäten in den Entwickleroptionen halten Sie ART/Dalvik zu zwingen Aktivitäten zu bereinigen, so schnell wie möglich für die Prüfung.

enter image description here

persönlich, verwende ich GC.Collect an vielen Stellen zu zwingen, Mono (und somit ART/Dalvik) Speicher zu fegen. Die meisten von denen sind Bilder im Zusammenhang/Bitmaps, die die Java/C# Brücke überqueren und Sie am Ende mit einem Bitmap-up, das ist „lebende“ in beiden VMs und damit die doppelte Speicherraubend ...

Ref: https://developer.xamarin.com/guides/android/advanced_topics/garbage_collection/

Verwandte Themen