2016-06-20 6 views
0

Ich habe eine einfache Anwendung, sammeln und zeigen Wifi-Scan-Ergebnisse mit ein paar zusätzlichen Funktionen, keine intensive CPU/RAM-Nutzung.Einfache Android-Anwendung going OOM

Das Problem ist, während mein Thread läuft (Dieser Thread scannt und gibt Ergebnisse über eine ExpandableListView aus), mein Speicher wird gerade mit 70MB auf einmal gefüllt.

Ich bemerkte beim Überprüfen des Speicherabbilds, dass meine Objekte, die ich erstelle, existieren, nachdem sie gelöscht wurden.

z.B. ein einfaches Beispiel dafür, was ich

private ExpandableListAdapter returnList(Context context, String[] APList) { 
    if (bLogging) { //Assume true 
     ArrayList<String> List = new ArrayList<>(); 
     foreach (AccessPoint ap: APList){ 
      //code initilializing and assigning param variables 
      List.add(new AP(param1, param2, param3)) 
     } 
     return (new ExpandableListAdapter(context, List)); 
    } 
} 

Bitte sorgen Sie sich nicht über jede Syntax, etc Probleme, das ist nur für das Verständnis meines Problems umgesetzt haben.

Dieses Stück Code wird von einem Thread laufen, 500ms jeden Schlaf

In diesem Beispiel erneut zu scannen, nachdem returnList() Ausführung beendet hat, die ArrayList<> List, new AP(param...) als Objekte bleiben, Speicher einnehmen.

//code before 

t = new Thread(new Runnable() { 
     public void run() { 
      handler = new Handler(context.getMainLooper()); 
      while (!bStopThread) { 
       ThreadCounter++; 

       handler.post(new Runnable() { 
        @Override 
        public void run() { 
         if (bSafe) { 
          initWiFiArrays(); //AccessPoint Objects are created as shown in example 
          CreateSetAdapter(); //Custom ExpandableListAdapter is created, but declared and instantiated within the method 
          threadRefresh.setText("# Refreshed Times : " + String.valueOf(ThreadCounter)); 
          writeResultsToFile(); 
         } else 
          stopScan(); 
        } 
       }); 
       try { 
        Thread.sleep(scanInterval); 
       } catch (Exception x) { 
        x.printStackTrace(); 
       } 
      } 
     } 
    }); 
t.start(); 

//code after 

UPDATE:

wird My Fadenschlinge durch definierte

I angegebenen Listen zum Clearing global umsortiert und einen scanResultCollection die +/- 9 Elemente enthalten, verringert sich diese aufgenommen Speicher durch 40Mb.

+1

Warum sollten sie nicht im Speicher verbleiben, wenn 'list' in Ihrer' return' Anweisung verwiesen wird? –

+0

Entschuldigung, wenn ich falsch verstehe, aber Java hat Garbage Collection, da diese Methode ihren Zweck erfüllt hat, wird es aufgeräumt werden, dies wird "nicht in Erinnerung" sein in dem Sinne, dass ich leicht darauf zugreifen kann. – KGCybeX

+1

Sie "lecken *" Ihre "lokale" Variable nach außen. Während es einen * live * Verweis auf ein Objekt gibt, ist es nicht Gegenstand der Garbage Collection. –

Antwort

1

Verwendung crashlytics library..this würden Sie helfen wissen, wo Speicherlecks in Ihrer App nehmen

+0

Was ist die Relevanz für die eigentliche Frage? –

+0

Ich benutze Android Studio, ich denke, es sollte ein Bug sein, ich bin auf ein paar Bugs gestoßen, wo Booleans nicht geändert werden, etc., aber ich werde es versuchen, danke – KGCybeX