SurfaceView onMeasure () no estableció la dimensión medida llamando setMeasuredDimension ()

Tengo un SurfaceView. Acabo de dibujar en él manualmente de otro hilo.

Funciona muy bien. Pero después de 10-20 minutos de funcionamiento en promedio consigo esta excepción:

01-14 08:51:25.000 3740-3740/com.myPackage E/AndroidRuntime﹕ FATAL EXCEPTION: main java.lang.IllegalStateException: onMeasure() did not set the measured dimension by calling setMeasuredDimension() at android.view.View.measure(View.java:15200) at android.widget.RelativeLayout.measureChild(RelativeLayout.java:602) at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:415) at android.view.View.measure(View.java:15195) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4823) at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) at android.view.View.measure(View.java:15195) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4823) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1390) at android.widget.LinearLayout.measureVertical(LinearLayout.java:681) at android.widget.LinearLayout.onMeasure(LinearLayout.java:574) at android.view.View.measure(View.java:15195) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4823) at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2340) at android.view.View.measure(View.java:15195) at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1850) at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1102) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1275) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4216) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) at android.view.Choreographer.doCallbacks(Choreographer.java:555) at android.view.Choreographer.doFrame(Choreographer.java:525) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) at android.os.Handler.handleCallback(Handler.java:615) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4813) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:559) at dalvik.system.NativeStart.main(Native Method) 

Android Documention dice:
Mida la vista y su contenido para determinar el ancho medido y la altura medida. Este método es invocado por measure (int, int) y debe ser anulado por subclases para proporcionar una medición precisa y eficiente de su contenido.

Como creo que la implementación original de google es la siguiente:

 @Override protected void More ...onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = getDefaultSize(mRequestedWidth, widthMeasureSpec); int height = getDefaultSize(mRequestedHeight, heightMeasureSpec); setMeasuredDimension(width, height); } 

No sé qué otra cosa debo implementar aquí.

Creo que el tamaño de la vista de la superficie nunca cambia.

NOTA:
Mi SurfaceView está contenido en un RelativeLayout.
La excepción es llamada por un niño, pero es una vista (línea 3 en la excepción)

Por favor, ayúdame si sabes cómo podría resolver este insecto molesto.

EDITAR:
En la actividad onCreate establecí el tamaño de mi vista (que extendió SurfaceView) del código

Answear para comentar:
Así es como establezco algunos campos públicos para el tamaño requerido:

 Parameters.initialize(getResources().getDisplayMetrics().widthPixels, getResources().getDisplayMetrics().heightPixels); 

Los parámetros.inicializar:

 public static void initialize(int screenWidth, int screenHeight){ FIELD_WIDTH = screenWidth; FIELD_HEIGHT = (int)(0.92f * screenHeight); } 

MyView está escrito en el xml.
Entonces pongo algo en ella:

 public class MyViewManager { protected MyView mMyView; public FieldPainterComp(MainActivity activity) { super(activity); initialize(); } private void initialize(){ mMyView= (MyView) activity.findViewById(R.id.vMyView); mMyView.getLayoutParams().height = Parameters.FIELD_HEIGHT; mMyView.getLayoutParams().width = Parameters.FIELD_WIDTH; } } 

Todo este proceso sucede uno en el principio.

 android:screenOrientation="landscape" 

La pantalla nunca se oscurece. El juego se está ejecutando, y simplemente la excepción está llegando.
¿Debo llamar medida en alguna parte?
No entiendo por qué sucede después de mucho tiempo

Alguna otra excepción que debe estar conectada con esto:

 01-19 11:53:39.812 29666-31881/com.mypackage V/GAV4﹕ Thread[disconnect check,5,main]: Disconnecting due to inactivity 01-19 11:53:39.812 29666-31881/com.mypackage V/GAV4﹕ Thread[disconnect check,5,main]: Disconnected from service 01-19 11:57:17.732 29666-29666/com.mypackage D/AndroidRuntime﹕ Shutting down VM 01-19 11:57:17.732 29666-29666/com.mypackage W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x420face0) 01-19 11:57:17.812 29666-29666/com.mypackage V/GAV4﹕ Thread[main,5,main]: Tracking Exception: IllegalStateException (@View:measure:16533) {main} 01-19 11:57:17.832 29666-29666/com.mypackage V/GAV4﹕ Thread[main,5,main]: Dispatch call queued. Dispatch will run once initialization is complete. 01-19 12:19:27.982 29666-29670/com.mypackage I/dalvikvm﹕ threadid=3: reacting to signal 3 01-19 12:19:28.262 29666-29670/com.mypackage I/dalvikvm﹕ Wrote stack traces to '/data/anr/traces.txt' 01-19 12:19:32.452 29666-29666/com.mypackage A/libc﹕ Fatal signal 6 (SIGABRT) at 0x0000025a (code=0), thread 29666 (ames.adaptation) 

El GAV es el material de Google Analytics.

Lanzé otra pregunta sobre la ANR: ANR con 3 hilos – usando cerraduras

 setMeasuredDimension() 

Debe ser llamado dentro de su método onMeasure (). Tuve un problema similar donde la lógica no estaba alcanzando setMeasuredDimension (). Resolví forzar la llamada de setMeasuredDimension () no importa lo que las declaraciones if / else lo precedieron.

Utiliza Fragmento y no escribe esta línea en la primera

 super.onCreate(savedInstanceState); 
  • ¿Cómo tomar una captura de pantalla de la vista de superficie de Android?
  • Crash con SurfaceView en Android NDK al pausar / reanudar la aplicación rápidamente
  • Android dibuja usando SurfaceView y el hilo
  • Android SurfaceView causando parpadeo de la pantalla
  • Android: problema SurfaceView (anchura, altura)
  • Cámara Android: la vista previa se amplía al grabar vídeo
  • Fragmentos - El niño especificado ya tiene un padre. Debe llamar a removeView () en el padre del niño primero
  • Android Multiple SurfaceViews
  • Adición de vista de texto a la vista de superficie
  • Dimensiones de pantalla que se calculan incorrectamente
  • El video de la API de MediaCodec de Android se reproduce demasiado rápido
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.