2012-01-19 8 views
20

mi aplicación Android 4 genera vistas largas al agregar múltiples textviews a linearlayout. Esto funciona bien para todos mis elementos de lista, excepto uno. El problema es que la lista de textviews aborta después de agregar el primer textview, ¡pero no se lanza ninguna excepción!"computeValuesWithHarfbuzz: hay que forzar la ejecución única" en Android 4: ¿Qué significa esto?

solo veo esta advertencia en mi LogCat:

TextLayoutCache | computeValuesWithHarfbuzz - necesita forzar a solo ejecutar

¿Alguien sabe lo que eso significa?

+1

HarfBuzz es el motor de renderizado de fuente/OpenType, utilizado en Firefox, entre otros. TextLayoutCache es un componente nativo de Android. ¿Qué diablos pones en ese TextView :-P .. probablemente deberías presentar un error si no está completamente fuera de la pared. Editar: No es el mismo [¿esto?] (Http://code.google.com/p/android/issues/detail?id=23465) – Jens

+0

Debuté todas las variables. Solo hay una cadena vacía dentro de esta vista de texto que parece estar dañada de alguna manera ... Curiosamente, mi aplicación está funcionando en este momento. Acabo de reiniciar la máquina virtual (computadora). Tal vez fue algún tipo de estado de máquina virtual corrupto que creó este problema. Afortunadamente, esto nunca volverá a ocurrir, pero al decir esto, probablemente lo hará;) – ninsky

+0

Lo obtuve también, sin ningún error de verificación. –

Respuesta

14

HarfBuzz es un/motor de diseño para la configuración de las fuentes OpenType. Su objetivo es estandarizar el diseño del texto en proyectos de código abierto. Esa advertencia, se remonta al android/graphics/TextLayoutCache.cpp.

El bloque de código relevante es:

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 {...} 

Esta parte del código es una parte del algoritmo BiDi (uBiDi) que significa Unicode bidireccional, como se detalla here.

de datos en árabe, hebreo o en otros idiomas RTL necesitan manejo de texto bidireccional. Debido a que estos scripts de derecha a izquierda usan dígitos que se escriben de izquierda a derecha, el texto es bidireccional en realidad: una mezcla de texto de derecha a izquierda e izquierda a derecha.

rc en lo anterior es la runcount del algoritmo. Cada personaje Unicode tiene asignado un nivel. (incluso los no asignados)

texto se separa en diferentes niveles, (nivel 0 es normal texto Inglés, Nivel 1 es evidente texto árabe, posiblemente incrustado dentro del nivel Inglés 0 texto, etc)

Las carreras ahora ocurrir de la siguiente manera.

Levels: 0 0 0 1 1 1 2 

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

contador de sucesión en el ejemplo anterior es 3. La advertencia se produce si el algoritmo BiDi no ha sido capaz de ejecutar con éxito una sola vez. Hay muchos errors que pueden ocurrir, lo que impide el funcionamiento correcto del algoritmo. Cualquiera de estos podría haber desencadenado la advertencia.

Sin embargo, si se produce o no la advertencia, el comportamiento de código es exactamente idénticos excepto por la advertencia conectado. Por lo tanto, no debería afectar el funcionamiento de la aplicación.

+0

Gracias Anirudh, respuesta perfecta! – ninsky

Cuestiones relacionadas