2012-09-24 8 views
13

que estaba esperando que alguien aquí podría tener una idea de lo que hace que este tipo de comportamiento:imágenes faltantes o incorrectos y fondos de forma aleatoria a lo largo del ciclo de vida de aplicaciones

A lo largo de mi solicitud, en lugares aparentemente al azar y en condiciones aleatorias que estoy observando esta extraño problema de UI. En ocasiones, las imágenes se cargan en negro (con los límites correctos) o con la fuente de imagen incorrecta (nuevamente, con los límites correctos). Esto afecta a ImageViews y ha efectuado etiquetas android:background con referencias a los recursos de color.

Mi aplicación se basa en 6 proyectos de biblioteca, ejecuta el código nativo a través de un servicio y las actividades en la aplicación utilizan GlSurfaceViews (aunque no todas las actividades que muestran el problema contienen componentes OpenGL). El problema podría ser cualquiera de estos lugares o una combinación de ellos mediante el uso de grandes cantidades de memoria.

Puede ver este comportamiento en las siguientes capturas de pantalla:

  • Esto es en realidad una imagen de separador de columna ancha 6 o menos píxeles que se ha elaborado de forma incorrecta en mi ImageView (ImageView parece haber tamaño correcto sí mismo).

    Torn

  • Al salir de la aplicación y luego volver de nuevo (varias veces) en su lugar apareció (y sigue siendo) de esta manera:

    Black

  • Después de una fuerza clara y una Borrar datos de la aplicación regresó al formato correcto:

    This is the original:

Como puede ver también, la imagen de la lupa que se encuentra junto a ella se muestra bien en cada una de ellas. Los problemas con estas imágenes y fondos faltantes/incorrectos parecen ocurrir al azar, a lo largo del ciclo de vida de la aplicación, y no he podido encontrar una forma de reproducirlo.

Los diseños para estas imágenes no son nada especial, no estoy haciendo nada gracioso durante el ciclo de vida del procesamiento (no estoy anulando onDraw() o onMeasure() o similares). La fuente de estas imágenes no se establece dinámicamente sino a través del XML.

Como puede ver en el ejemplo anterior, no es un problema de compilación ya que ocurre entre los ciclos de vida de las aplicaciones, no entre las instalaciones. También está sucediendo en diferentes dispositivos, Samsung 8.9, Acer Iconia Tab, Motarola XOOM,

Me parece que hay algún tipo de error con la tabla de referencia, ¿podría haber sido empujado por mi código nativo? ¿O es un efecto mío en algunas etapas de la aplicación que usa demasiada memoria?

Aquí está el origen XML para el ejemplo anterior:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:id="@+id/browseProgressWrapper" 
       android:layout_width="match_parent" 
       android:layout_height="@dimen/actionbar_compat_height" 
       android:orientation="horizontal"> 
    <RelativeLayout android:layout_width="@dimen/search_bar_width" 
        android:layout_height="match_parent">  
     <EditText  android:id="@+id/browseFilter" 
         android:layout_width="match_parent" 
         android:layout_height="match_parent" 
         android:layout_marginTop="4dp" 
         android:layout_marginLeft="5dp"   
         android:imeOptions="actionSearch" 
         android:background="@drawable/edit_text_blue" 
         android:maxLength="30"/> 
     <ImageView  android:id="@+id/clearSearch" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:layout_alignParentRight="true" 
         android:layout_centerVertical="true" 
         android:src="@drawable/ic_input_delete" 
         android:layout_marginRight="5dp"/> 
    </RelativeLayout>     
    <ImageView  android:id="@+id/browseFilterButton" 
        android:src="@drawable/ic_menu_search" 
        android:scaleType="center" 
        android:layout_width="@dimen/actionbar_compat_height" 
        android:layout_height="@dimen/actionbar_compat_height" 
        android:layout_gravity="center_vertical" 
        android:minWidth="@dimen/actionbar_compat_height"/>   
</LinearLayout> 

Una descripción más completa del código/diseño que rodea a otra que ocurra esto me pasó a conseguir la captura de pantalla para:

tengo una "Configuración" Activity que reinicia mi aplicación después de guardar los detalles de las nuevas configuraciones. Esto se logra mediante la detención de un Service, llamando a un nuevo Activity (la actividad Splash) y terminando en sí:

mConfiguration.save(); 
    mConfiguration = new Configuration(Configuration.getInstance()); 
    getActivity().stopService(new Intent(getActivity(), NativeService.class)); 
    getActivity().finish(); 
    startActivity(new Intent(getActivity(), SplashActivity.class)); 

mayoría de las veces (y en la mayoría de los dispositivos) esto funciona bien, la actividad de presentación contiene una imagen que carga correctamente. A veces, sin embargo, en algunos dispositivos, la actividad de Splash carga un recurso incorrecto (lo que mis probadores llaman "un tic de Nike al revés") o simplemente un recuadro en blanco (como se ve a continuación). ¿Alguien sabe por qué?

enter image description here

Este es el diagrama de la página de bienvenida, como se puede ver que es bastante sencillo, sin sorpresas:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/ContentBackgroundColor" 
    android:orientation="vertical" > 

    <View 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:layout_weight="2" /> 

    <ImageView 
     android:id="@+id/image" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     android:src="@drawable/manager_android_400" /> 

    <View 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:layout_weight="1" /> 

    <ProgressBar 
     style="@android:style/Widget.ProgressBar.Large" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" /> 

    <View 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:layout_weight="2" /> 

</LinearLayout> 

probado Teoría y debunct:

tengo teorizó que esto podría ser un problema de procesador/memoria donde el diseño no se dibuja completamente antes de que salga la pantalla de Splash y pase a la siguiente actividad, así que puse este código:

image = (ImageView) findViewById(R.id.image); 
    image.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

     @Override 
     public void onGlobalLayout() { 
      image.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
      moveToStartScreen.start(); 
     } 
    }); 

La esperanza era que el código anterior asegurara que la Imagen se cargue definitivamente antes de pasar a la página de inicio, pero parece que no tuvo ningún efecto observable.

Otra teoría

También me preguntaba si esto podría ser causado por los recursos R.id/R.colour/R.drawable de alguna forma se currupted en la ejecución del programa? ¿Alguien sabe por qué que podría suceder?

¿Podría mi código nativo correr desenfrenado en algunas direcciones de memoria que Android no está asignando correctamente?

¿Alguien ha notado esto antes? ¿O quizás sabe por qué ocurre este comportamiento?

+0

He tenido problemas con el despliegue de los sobres impropios en los proyectos de la biblioteca que estaba utilizando, y como usted informó lo mismo lo busqué en Google y terminé en http://stackoverflow.com/questions/7724145/android-drawable -resource-id-conflict. ¿Alguna ayuda? – aamit915

+0

¿Podría explicarnos un poco más sobre cómo su código nativo interactúa con su aplicación? El código nativo garabateando algo parece más plausible para mí. –

+0

@MattGibson El código nativo se conecta a través de métodos JNI que activan métodos de devolución de llamada/escucha que el componente de la interfaz de usuario puede registrar para recibir. No hay envío directo de datos fuera de JNI a menos que considere la escritura de código nativo en el contexto de OpenGL directamente. – Graeme

Respuesta

2

Graeme, tuve casi el mismo problema y descubrí que se trataba de un informe bug de la plataforma de Android. Fue corregido en la versión 3.0, creo. ¿Con qué API estás compilando? Intente compilar con la última API disponible y asegúrese de compilar con JDK 1.6

Si su problema está relacionado con este error, esto debería solucionar el problema.

+0

Sin duda se presenta de manera diferente a la del informe de error (Las imágenes faltantes están en toda la aplicación y por lo tanto no son la "primera" imagen, aunque puedo imaginar fácilmente que esto es una colisión de identificación de recursos y siempre sospeché Ser un error de sistema operativo – Graeme

+1

Puedo confirmar que este error no está presente en las versiones de Honeycomb + del sistema operativo, por lo que espero que las apariciones disminuyan a medida que más dispositivos se actualicen o se vuelvan obsoletos. – Graeme

0

Este es un problema simple de actualización, limpieza y reconstrucción. Las imágenes en sus diversas carpetas dibujables o índices de Id. De recurso están fuera de secuencia porque se cambiaron fuera del eclipse IDE (a través de control de fuente externo como GIT, SVN u otras ediciones) y no se actualizaron en el eclipse de navegador. O bien, es posible que los archivos se hayan actualizado en un proyecto de biblioteca del que depende su Actividad de IU.

He encontrado que, aunque las dependencias de archivos .java se propagan por todo el sistema, este no es siempre el caso de recursos como imágenes y archivos .xml.

La solución es bastante simple, limpie todo, actualice todos sus proyectos y reconstruya. Los bordes estirados o negros deben desaparecer.

Nota: La manifestación predominante de este problema se produce cuando las imágenes de 9 parches se tratan como imágenes .png estándar. Esto significa que se estiran de forma lineal en la imagen en lugar de limitarse a los bordes. Para mí, esto explica tu ejemplo 'Torn/Stretched'. He visto similares a menudo. ¡Otra manifestación común es que las cadenas de texto se muestran ocasionalmente con los recursos incorrectos!

+0

Tuve un problema similar cuando se produjo un error al procesar las imágenes de 9 parches, pero la construcción de Maven no procesó ninguna imagen después de la imagen problemática, pero la construcción completa no fallaría, lo que dio como resultado imágenes de 9 parches no procesados ​​(que obtener construido por la cadena de herramientas SDK de Android) que se incluye en la APK atornillar todos los efectos visuales. Lo bueno fue que fue maven y hubo un error que se imprimió para encontrar el problema. No estoy seguro de si la compilación de Eclipse puede mostrarle un registro, pero si puede/lo hace, puede encontrarlo quejándose de un recurso que lo arroja todo. –

+0

Gracias por su respuesta. He tenido este problema durante semanas durante meses en más de 10 compilaciones de lanzamiento y sé cuántos cientos de compilaciones de depuración. – Graeme

+0

Además, las imágenes involucradas no son 9 parches, y algunas de ellas ni siquiera son imágenes (son enlaces a recursos de color). Además, borrar los datos en la aplicación y comenzar de nuevo corrige el problema, lo que significa que no puede ser un problema de compilación. – Graeme

Cuestiones relacionadas