2011-03-06 1 views
2

私はAndroidアプリでjava SAXパーサーを実装しています。メモリ使用量を最小限に抑えるためにSAXハンドラのcharacter()関数を実装する方法は?

私はすべての機能を持っていますが、私は必要とされるより多くのメモリを吸い取っている小さな断片を最適化しようとしています。

これは私の現在の(と私の知るところではありますが)、DefaultHandlerのcharacter()関数の実装です。

String currentText = ""; 

    @Override 
public void characters(char[] ch, int start, int length) 
{ 
    if(currentText.length() > 0) 
    { 
     currentText = currentText.concat(new String(ch, start, length)); 
    }else 
    { 
     //Takes half as much memory as concating to empty string 
     currentText = new String(ch, start, length); 
    } 
} 

基本的にこの関数は、SAXが要素内でテキストを検出したときに呼び出されます。ただし、テキスト全体が一度に解析されることは保証されていないので、現在のテキストが現在のテキストに追加される必要があります(currentTextはすべての要素の最後に ""に設定されます)。

私はこのコードを一緒に投げて動作させ、残りのパーサーをテストできるようにしましたが、これは最適化する必要があります。

これを実装してできるだけ少ないメモリを使用するための提案はありますか?

答えて

9

StringBuilderを使用してください。

StringBuilder currentText = new StringBuilder(); 

@Override 
public void characters(char[] ch, int start, int length) 
{ 
    currentText.append(ch, start, length); 
} 

後でcurrentText.toString()に電話してください。

更新はトリムシミュレートする:

@Override 
public void characters(char[] ch, int start, int length) 
{ 
    if(length == 0) return; 
    int end = (start + length) - 1; 
    while(char[start] <= '\u0020') 
    { 
     if(start == end) return; 
     start++; 
     length--; 
    } 
    while(char[end] <= '\u0020') 
    { 
     if(end == start) return; 
     length--; 
     end--; 
    } 
    currentText.append(ch, start, length); 
} 
+0

をStringBuilderのから空白を(/ U0020と、すなわち以下)トリミングする方法があります場合は、知っていますか?今、私はbuilder.toString()。trim()を使用しています。これは、ほとんどの場合、メモリを倍に使います。 – CodeFusionMobile

+0

申し訳ありませんが、私は最終的な文字列を組み立てたらトリムすることを意味します。これにより、個々のセグメントが個別にトリムされ、有効な空白が削除される可能性があります。私の全体的な文字列は "\ nコードフュージョン\ n"と言っていますが、 "\ nコード"と "フュージョン\ n"の2つのチャンクで取得しました。あなたのコードは "Code Fusion"ではなく "CodeFusion"になります。私はこのアプローチを最初から考えていたので、 – CodeFusionMobile

関連する問題