gpt4 book ai didi

java - 简单的 Android 应用程序即将 OOM

转载 作者:行者123 更新时间:2023-12-01 09:46:55 24 4
gpt4 key购买 nike

我有一个简单的应用程序,可以收集并显示 Wifi 扫描结果,并具有一些额外功能,无需大量 CPU/RAM 使用。

问题是当我的线程运行时(该线程扫描并通过 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));
}
}

请不要担心任何语法等问题,这只是为了理解我的问题。

这段代码由 Thread 运行,每睡一次500ms重新扫描

在此示例中,在 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

更新:

我求助于清除全局声明的列表和包含 +/- 9 个项目的 scanResultCollection,这减少了 40Mb 占用的内存。

最佳答案

使用 crashlytics 库..这将帮助您了解应用程序中内存泄漏的位置

关于java - 简单的 Android 应用程序即将 OOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37924001/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com