![](/img/trans.png)
[英]OutOfMemoryError in StringBuilder.append() even with more than enough memory
[英]Out of memory error : StringBuilder.append throwing OutOfMemoryError
我正在開發一個從藍牙設備獲取數據的應用程序。 但有時它在執行某些操作時會拋出OOM 錯誤
這是代碼
以下方式我將數據存儲在ArrayList<String>
private ArrayList<String> dataList;
if (response.compareTo("Some Filter") != 0 //response is of String type
{
dataList.add(response);
}
在下面for each
循環中,它會引發 OOM 錯誤
for (String s : dataList) {
if(s.length()>8)
dataList.set(dataList.indexOf(s), s.substring(8));
else
dataList.set(dataList.indexOf(s), "");
}
String downloadedData = "";
for (String s : dataList) {
downloadedData += s; //This one is the 280th line throwing OOM
}
到目前為止,我已經閱讀了這篇文章,但它提供了在 json 或 web 響應中讀取數據的解決方案
而且我知道無法處理 OOM 錯誤,但可以通過遵循良好的架構來防止
Android 也有這兩個回調
但我不知道如何尋求解決方案!!
崩潰堆棧跟蹤是:
java.lang.OutOfMemoryError: Failed to allocate a 106990 byte allocation with 5840 free bytes and 5KB until OOM
at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:95)
java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:146)
at java.lang.StringBuilder.append(StringBuilder.java:216)
at Class_name.java:280.
任何幫助表示贊賞:)
首先: if (response.compareTo("Some Filter") != 0 )
這很奇怪,你可以使用equals
方法。
然后你將響應添加到列表中,然后你減少列表中所有響應的長度,如果它們大於 8(另外,你做了substring(8)
,它修剪了前 8 個字母,我認為你想保留前 8 個字母並刪除其余字母,如果是,則執行此substring(0, 8)
)。
我的回答是:當你將它添加到列表時,為什么不只是照顧你在for-each
中所做的事情? 這會容易得多,而且在性能方面會更好,並且可能會修復您的錯誤。
另外,我不確定您是否正在初始化您的列表,也許您只是忘記粘貼它(您所擁有的只是private ArrayList<String> dataList;
),但這就是您創建新列表的方式:
List<String> list = new ArrayList<String>();
首先你的循環應該使用
for (int i = 0; i < dataList.size(); ++i) {
String s = dataList.get(i);
dataList.set(i, s.length() > 8 ? s.substring(8) : "");
}
錯誤指向另一個方向。
試試看是否有效
ArrayList<String> dataList = new ArrayList<>();
String response = "CVMKVLC";
if (response.compareTo("Some Filter") != 0 ) {
//response is of String type
dataList.add(response);
}
for (String s : dataList) { //This line throws OOM
if(s.length()>8)
dataList.set(dataList.indexOf(s), s.substring(8));
else
dataList.set(dataList.indexOf(s), "");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.