我的应用程序从文本文件资产中读取大量数据,并将它们显示在 TextView 的屏幕上。(最大的是 ~450k。)我将文件逐行读入SpannableStringBuffer(因为我删除了一些元数据,例如部分名称)。在我将应用程序投放市场的两年中(超过 7k 的活动设备安装),这种方法一直有效,因此我知道代码是相当正确的。
但是,我最近收到了一位用户关于LG Lucid(LGE VS840 4G,Android 2.3.6)的报告,称该文本已被截断。从日志条目中,我的应用程序在缓冲区中只有 9,999 个字符。这是SpannableStringBuffer的已知问题吗?还有其他推荐的方法来构建大型Spannable缓冲区吗?任何建议的解决方法?
除了在每次追加到SpannableStringBuilder时保持单独的预期长度之外,我什至没有检测错误的好方法,因为追加接口返回对象,而不是错误!
我读取数据的代码是:
currentOffset = 0;
try {
InputStream is = getAssets().open(filename);
BufferedReader br = new BufferedReader(new InputStreamReader(is));
ssb.clear();
jumpOffsets.clear();
ArrayList<String> sectionNamesList = new ArrayList<String>();
sectionOffsets.clear();
int offset = 0;
while (br.ready()) {
String s = br.readLine();
if (s.length() == 0) {
ssb.append("\n");
++offset;
} else if (s.charAt(0) == '\013') {
jumpOffsets.add(offset);
String name = s.substring(1);
if (name.length() > 0) {
sectionNamesList.add(name);
sectionOffsets.add(offset);
if (showSectionNames) {
ssb.append(name);
ssb.append("\n");
offset += name.length() + 1;
}
}
} else {
if (!showNikud) {
// Remove nikud based on Unicode character ranges
// Does not replace combined characters (\ufb20-\ufb4f)
// See
// http://en.wikipedia.org/wiki/Unicode_and_HTML_for_the_Hebrew_alphabet
s = s. replaceAll("[\u05b0-\u05c7]", "");
}
if (!showMeteg) {
// Remove meteg based on Unicode character ranges
// Does not replace combined characters (\ufb20-\ufb4f)
// See
// http://en.wikipedia.org/wiki/Unicode_and_HTML_for_the_Hebrew_alphabet
s = s.replaceAll("\u05bd", "");
}
ssb.append(s);
ssb.append("\n");
offset += s.length() + 1;
}
}
sectionNames = sectionNamesList.toArray(new String[0]);
currentFilename = filename;
Log.v(TAG, "ssb.length()=" + ssb.length() +
", daavenText.getText().length()=" +
daavenText.getText().length() +
", showNikud=" + showNikud +
", showMeteg=" + showMeteg +
", showSectionNames=" + showSectionNames +
", currentFilename=" + currentFilename
);
查看界面后,我计划用InputFilter替换 showNikud 和 showMeteg 案例。