2016-06-20 4 views
0

私はシンプルなアプリケーションを持っており、Wifiスキャン結果を収集して表示します。シンプルなAndroidアプリケーションが登場OOM

問題はスレッドが実行中(このスレッドはExpandableListViewでスキャン結果を出力しています)、私のメモリは一度に70Mbまでいっぱいです。

私が作成したオブジェクトが消去された後に存在するメモリダンプを確認すると気付きました。

私は

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)); 
    } 
} 

を実装しているかの簡単な例は、これはちょうど私の問題を理解するためにある、任意の構文、などの問題を心配しないでください。コードのこの作品は、この例では

を再スキャンするすべての500msを寝て、Threadによって運営されて

returnList()が実行を終了した後、ArrayList<> Listnew AP(param...)はメモリを占有して、オブジェクトとして残ります。

//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:私はクリアに頼っ

がグローバル+/- 9つの項目が含まれているリストとscanResultCollectionを宣言しが、これはメモリがに取り込ま減少

マイ糸ループは次のように定義されます40Mb。

+1

あなたのアプリで場所を取るところから知って役立つだろうか? –

+0

私は誤解しても、Javaはガベージコレクションを持っています。このメソッドは目的を終えているので、クリーンアップされます。これは簡単にアクセスできるという意味で「メモリには」ありません。 – KGCybeX

+1

あなたはあなたの 'local'変数を外部スコープに「漏らしています」。オブジェクトへの* live *参照がありますが、ガベージコレクションの対象ではありません。 –

答えて

1

使用crashlyticsのlibrary..thisを使用すると、メモリリークが `List`があなたの` return`文で参照されたときに、なぜ彼らは記憶に残っていないでしょう

+0

実際の質問との関連性は何ですか? –

+0

私はAndroidスタジオを使用しています、私はそれがバグではないと思っています、私はバリューが変更されていないいくつかのバグに出くわしましたが、私はそれを試してみてください、ありがとう – KGCybeX

関連する問題