0

私のアプリは、テキストファイルアセットから大量のデータを読み取り、それらを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に置き換える予定です。

4

2 に答える 2

0

これはSpannableStringBufferの既知の問題ですか?

ソースコードには、のサイズに厳しい制限があることを示唆するものは何もありませんSpannableStringBuffer。あなたの経験からすると、これはそのデバイスに特有の問題であると思います。これは、デバイスメーカーのエンジニアによる愚かな決定によるものです。

提案された回避策はありますか?

Google Playストアを通じて配布している場合は、コンソールでこのデバイスをブロックしてください。

または、1つの大きなウィジェットをTextView使用せずに、代わりに(リサイクルできるように)複数の小さなTextViewウィジェットを使用します(おそらく段落ごとに1つ)。ListViewこれには、メモリフットプリントを削減するという追加の利点があります。

または、HTMLを生成し、コンテンツをに表示しますWebView

于 2012-05-13T11:25:20.063 に答える
0

テストアプリを作成した(そしてユーザーに実行させた)後、彼のデバイスにはこの任意の制限があるように見えますが、またはSpannableStringBuilderではありません。クイックチェンジをテストして、に読み込み、結果からを作成しました。残念ながら、それは完全に読み込まれるまでスパンを作成できないことを意味します。StringBuilderStringBufferStringBuilderSpannableString

で複数のTextViewオブジェクトを使用することを検討する必要があります。ListViewまた、を使用Html.FromHtmlして、アプリの長期計画に適しているかどうかを確認する必要があります。

于 2012-05-14T17:18:55.137 に答える