私のアプリは、テキストファイルアセットから大量のデータを読み取り、それらをTextViewの画面に表示します。(最大は約450kです。)ファイルを1行ずつSpannableStringBufferに読み込みます(セクション名など、削除するメタデータがあるため)。このアプローチは、私がアプリを市場に出している(7k以上のアクティブなデバイスがインストールされている)という2年間の苦情なしに機能したので、コードがかなり正しいことを知っています。
しかし、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
);
インターフェイスを確認した後、showNikudとshowMetegのケースをInputFilterに置き換える予定です。