Android4中的"computeValuesWithHarfbuzz - 需要强行单机运行":这是什么意思?

nin*_*sky 20 android

我的Android 4应用程序通过向textviewsa 添加多个来生成长视图linearlayout.这适用于我的所有列表项,除了一个.问题是,textviews添加第一个之后的中止列表textview,但没有异常被抛出!

我只是在LogCat中看到这个警告:

TextLayoutCache | computeValuesWithHarfbuzz - 需要强制单次运行

有谁知道这意味着什么?

Ani*_*han 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 {...}
Run Code Online (Sandbox Code Playgroud)

这部分代码是BiDi算法(uBiDi)的一部分,代表Unicode双向,详见此处.

阿拉伯语,希伯来语或其他RTL语言的数据需要处理双向文本.因为这些从右到左的脚本使用从左到右书写的数字,所以文本实际上是双向的:从右到左和从左到右文本的混合.

rc在上面是算法的运行计数.每个unicode字符都分配了一个级别.(即使是未分配的)

文本首先被分成不同的级别,(级别0是纯英文文本,级别1是纯阿拉伯文本,可能嵌入英语0级文本等)

现在以下列方式进行运行.

 Levels:  0   0   0   1   1   1   2

 Runs:   <--- 1 ---> <--- 2 ---> <3>
Run Code Online (Sandbox Code Playgroud)

上例中的运行计数为3.如果BiDi算法甚至无法成功运行,则会抛出警告.可能发生许多错误,阻止算法的成功运行.其中任何一个都可以触发警告.

但是,无论警告是否发生,除了记录的警告外,代码行为完全相同.因此,它不应该影响应用程序的运行.