2012-01-19 12 views
20

私のAndroid 4アプリは、linearlayoutに複数のtextviewsを追加してロングビューを生成します。これは、1つを除くすべての私のリスト項目でうまく機能します。問題は、最初にtextviewを追加した後にtextviewsのリストが異常終了しますが、例外はスローされません。"computeValuesWithHarfbuzz - Androidで1回実行する必要がある" 4:これはどういう意味ですか?

私はちょうど私のLogCatで、この警告を参照してください。

TextLayoutCacheを| computeValuesWithHarfbuzz - 実行

はそれが何を意味するのか、誰を知っています単一 に強制する必要がありますか?

+1

harfbuzzは、フォント/ OpenTypeレンダリングエンジンで、Firefoxなどで使用されています。 TextLayoutCacheはAndroidのネイティブコンポーネントです。あなたはTextViewに何を入れましたか:-P ..壁から完全に離れていなければ、おそらくバグを報告するべきです。編集:それは[これと同じではありませんか?](http://code.google.com/p/android/issues/detail?id=23465) – Jens

+0

私はすべての変数をデバッグしました。このテキストビューには何らかの形で壊れているような空の文字列があります...奇妙なことに、私のアプリは今働いています。私はVM(コンピュータ)を再起動しました。たぶん、この問題を引き起こした何らかの種類の破損したVMの状態でした。うまくいけば、これは決して再び起こらないが、これを言って、それはpropably;) – ninsky

+0

私はそれも、検証エラーなしでそれを得た。 –

答えて

14

HarfBuzzはOpenTypeフォント用のレイアウト/シェーピングエンジンです。その目的は、オープンソースプロジェクトのテキストレイアウトを標準化することです。その警告は、android/graphics/TextLayoutCache.cppにさかのぼることができます。

関連するコードブロックである:

ubidi_setPara(bidi, chars, contextCount, bidiReq, NULL, &status); //runs the algorithm 
int paraDir = ubidi_getParaLevel(bidi) & kDirection_Mask; // 0 if ltr, 1 if rtl 

    if (U_SUCCESS(status) && rc == 1) { 
      // Normal case: one run, status is ok 
      isRTL = (paraDir == 1); 
      useSingleRun = true; 
     } else if (!U_SUCCESS(status) || rc < 1) { 
      LOGW("computeValuesWithHarfbuzz -- need to force to single run"); 
      isRTL = (paraDir == 1); 
      useSingleRun = true; 
     } else {...} 

コードのこの部分は、詳細なhereとして、ユニコード双方向の略のBiDiアルゴリズム(uBiDi)の一部です。

アラビア語、ヘブライ語または別のRTL言語のデータは、双方向テキストの処理が必要です。これらの右から左のスクリプトは左から右に書き込まれる数字を使用するため、テキストは実際には双方向です。右から左、左から右のテキストが混在しています。

rcは、アルゴリズムのruncountです。各ユニコード文字にはレベルが割り当てられます。 (でも、割り当てられていないもの)

テキストは、さまざまなレベルへの最初の分割があり、今

実行(レベル0に平易な英語のテキストで、レベル1は、おそらく英語のレベル0テキスト内に埋め込まれ、プレーンアラビア語のテキスト、などです)次のように発生する。上記の例では

Levels: 0 0 0 1 1 1 2 

Runs: <--- 1 ---> <--- 2 ---> <3> 

実行回数はのBiDiアルゴリズムは一度も正常に実行することができなかった場合、警告がスローされた3 です。発生する可能性があるのは多くのerrorsであり、アルゴリズムの正常な実行を妨げます。 これらのいずれかが警告をトリガした可能性があります。

警告が発生するかどうかにかかわらず、コードの動作は、記録された警告を除いてまったく同じです。したがって、アプリケーションの実行に影響を与えるべきではありません。

+0

ありがとうございますAnirudh、完璧な答え! – ninsky