簡體   English   中英

內存不足錯誤:StringBuilder.append 拋出 OutOfMemoryError

[英]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 也有這兩個回調

  1. onLowMemory()
  2. onTrimMemory()

但我不知道如何尋求解決方案!!

崩潰堆棧跟蹤是:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM