私はシンプルなアプリケーションを持っており、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<> List
、new 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。
あなたのアプリで場所を取るところから知って役立つだろうか? –
私は誤解しても、Javaはガベージコレクションを持っています。このメソッドは目的を終えているので、クリーンアップされます。これは簡単にアクセスできるという意味で「メモリには」ありません。 – KGCybeX
あなたはあなたの 'local'変数を外部スコープに「漏らしています」。オブジェクトへの* live *参照がありますが、ガベージコレクションの対象ではありません。 –