2012-05-13 16 views
0

私のアプリケーションは、テキストファイルのアセットから大量のデータを読み込み、TextViewに表示します。 (最大は〜450kです。)ファイルをSpannableStringBufferに1行ずつ読み込みます(セクション名などのメタデータがいくつかあります)。このアプローチは、2年間で私が市場にアプリを持っていた(7kを超えるアクティブデバイスのインストール)苦情なしで働いていたので、コードが合理的に正しいことを知っています。SpannableStringBufferは9,999文字に制限されていますか?

しかし、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ケースを交換する予定。

答えて

0

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

ソースコードには、SpannableStringBufferのサイズにハード制限があります。あなたの経験から考えると、デバイスメーカーのエンジニアによる愚かな決定のため、これはそのデバイスに特有の問題です。

推奨される対処方法はありますか?

Google Playストアで配信する場合は、この端末をコンソールでブロックします。

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

または、HTMLを生成して内容をWebViewに表示してください。

+0

'ListView'(' ScrollView'内)に 'TextView'をたくさん作成すると、画面からスクロールした' TextView'sは自動的に再フォーマットされますか? ''WebView'sは残念なことにオプションではありませんが、私は音声のヘブライ語のテキストを表示し、Androidはそれを後方に表示します(バグは修正されていますが、ICSのみです)。 – shmuelp

+0

@shmuelp: "自動的にrecyled?" - うまく書かれた 'Adapter'、はい。 – CommonsWare

0

テストアプリを作成して(ユーザーが実行した後)、デバイスにSpannableStringBuilderのこの任意の制限がありますが、StringBuilderまたはStringBufferではありません。私は速い変更をテストしてStringBuilderに読み込み、結果からSpannableStringを作成しました。残念ながら、それは、それが完全に読み込まれるまで、私はスパンを作成することができないことを意味します。

私はそれが私のアプリの長いのためのより良い動作するかどうかを確認するためにListViewに複数にTextViewオブジェクトを使用して、同様にHtml.FromHtmlの使用を検討する必要があります長期計画。

関連する問題