2013-10-08 26 views
2

我的應用程序獲取電子名片爲字符串,並提出一起到大串通過的StringBuilderStringBuilder的似乎是出容量

public String getVcardStrings() throws Exception { 
    Cursor cursor = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null); 
    StringBuilder builder = new StringBuilder(); 
    if (cursor.moveToFirst()) ; 
    do { 
     String s = getVCardStringFromContact(cursor); 
     L.d("VCARD", s); 
     builder.append(s); 
    } while (cursor.moveToNext()); 
    cursor.close(); 

    L.d("VCARD", "Output: \n" + builder.toString()); 
    return builder.toString(); 
} 

每個getVCardAsString()調用的輸出是正確的。它包含所有數據。但調用builder.toString()onlly返回1,5個聯繫人的vcard數據,這是約4kb的文本數據,其餘的只是丟失!

沒有例外,我讀過StringBuilders的容量理論上可以達到4GB。現在我的問題是,這裏發生了什麼?

+0

你在那裏有2個日誌行的輸出是什麼?你最終想用返回的字符串值做什麼? – SBerg413

+0

它實際上返回字符串的一部分?或者你的意思是日誌輸出只是部分?第二種情況是正常的) – Leonidos

+0

它不僅僅打印2個日誌行,它實際上打印了大約25行,一個完整的聯繫人和一個半。可能確實是一個記錄器的事情。從數據庫中讀取聯繫人之後立即將其更改爲立即寫入文件,現在這個「問題」已經過時了。無論如何,謝謝=) –

回答

3

我敢肯定這是假陽性:

換句話說數據是有,但正在被logcat的截斷。 這一觀察結果似乎這個定義來驗證:

#define LOGGER_ENTRY_MAX_LEN  (4*1024) 

這是爆炸式4KB,並直接關係到你正在經歷。

將您的輸出寫入文件以檢查它是否真的存在。

+0

我必須把這條線放在哪裏? –

+0

這個定義是在Android操作系統中。沒有什麼可以做的改變它缺乏建立自己的ROM。如果你想快速測試這個,請輸出字符串到TextView,看看你是否得到了你所期望的一切。 – sweetlilmre