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).
Al salir de la aplicación y luego volver de nuevo (varias veces) en su lugar apareció (y sigue siendo) de esta manera:
Después de una fuerza clara y una Borrar datos de la aplicación regresó al formato correcto:
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é?
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?
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
¿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í. –
@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