0

我的应用程序从文本文件资产中读取大量数据,并将它们显示在 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 案例。

4

2 回答 2

0

这是 SpannableStringBuffer 的已知问题吗?

我在源代码中没有看到任何建议对SpannableStringBuffer. 根据您的经验,我猜这是该设备特有的问题,因为设备制造商的工程师做出了一个愚蠢的决定。

任何建议的解决方法?

如果您通过 Google Play 商店分发,请在您的控制台中阻止此设备。

或者,不要使用一个巨大的TextView,而是TextView在一个中使用几个较小的小部件ListView(这样它们可以被回收),也许每段一个。这应该具有减少内存占用的额外好处。

或者,生成 HTML 并以WebView.

于 2012-05-13T11:25:20.063 回答
0

在编写(并让用户运行)一个测试应用程序之后,他的设备似乎对 有这个任意限制SpannableStringBuilder,但没有StringBuilderor StringBuffer。我测试了一个快速更改以读取 a StringBuilder,然后SpannableString从结果中创建 a 。不幸的是,这意味着在完全读入之前我无法创建跨度。

我必须考虑TextView在 a 中使用多个对象ListView,以及使用Html.FromHtml来查看这是否更适合我的应用程序的长期计划。

于 2012-05-14T17:18:55.137 回答