2011-07-21 12 views
5

Estoy desarrollando un Live Wallpaper para Honeycomb 3.0, pero aparece un error al azar.IllegalArgumentException mientras gira el dispositivo en Live Wallpaper Picker Android 3.0

Cuando estoy en fondo de pantalla selector (la ventana con los botones "Establecer fondo de pantalla" y "Configuración ...", para entender) y se muestra en vivo fondo de pantalla, si gira el dispositivo, el fondo de pantalla debe recargar con la configuración adaptada para nueva orientación. A veces sucede, a veces se cuelga.

El error es de alguna manera relacionada con método BaseSurfaceHolder.unlockCanvasAndPost, pero realmente no saber donde está el problema. Creo que no se puede cargar correctamente algunos recursos ..

Aquí hay registro de errores:

07-21 16:07:38.490: WARN/WindowManager(292): java.lang.IllegalArgumentException: Requested window [email protected] does not exist 
07-21 16:07:38.490: WARN/WindowManager(292):  at com.android.server.wm.WindowManagerService.windowForClientLocked(WindowManagerService.java:6731) 
07-21 16:07:38.490: WARN/WindowManager(292):  at com.android.server.wm.WindowManagerService.windowForClientLocked(WindowManagerService.java:6722) 
07-21 16:07:38.490: WARN/WindowManager(292):  at com.android.server.wm.WindowManagerService.removeWindow(WindowManagerService.java:2414) 
07-21 16:07:38.490: WARN/WindowManager(292):  at com.android.server.wm.Session.remove(Session.java:149) 
07-21 16:07:38.490: WARN/WindowManager(292):  at android.view.IWindowSession$Stub.onTransact(IWindowSession.java:120) 
07-21 16:07:38.490: WARN/WindowManager(292):  at com.android.server.wm.Session.onTransact(Session.java:111) 
07-21 16:07:38.490: WARN/WindowManager(292):  at android.os.Binder.execTransact(Binder.java:320) 
07-21 16:07:38.490: WARN/WindowManager(292):  at dalvik.system.NativeStart.run(Native Method) 
07-21 16:07:38.490: ERROR/AndroidRuntime(20768): FATAL EXCEPTION: main 
07-21 16:07:38.490: ERROR/AndroidRuntime(20768): java.lang.IllegalArgumentException 
07-21 16:07:38.490: ERROR/AndroidRuntime(20768):  at android.view.Surface.unlockCanvasAndPost(Native Method) 
07-21 16:07:38.490: ERROR/AndroidRuntime(20768):  at com.android.internal.view.BaseSurfaceHolder.unlockCanvasAndPost(BaseSurfaceHolder.java:215) 
07-21 16:07:38.490: ERROR/AndroidRuntime(20768):  at mx.livewallpaper.clock.CubeWallpaper1$CubeEngine.drawFrame(CubeWallpaper1.java:686) 
07-21 16:07:38.490: ERROR/AndroidRuntime(20768):  at mx.livewallpaper.clock.CubeWallpaper1$CubeEngine$1.run(CubeWallpaper1.java:292) 
07-21 16:07:38.490: ERROR/AndroidRuntime(20768):  at android.os.Handler.handleCallback(Handler.java:587) 
07-21 16:07:38.490: ERROR/AndroidRuntime(20768):  at android.os.Handler.dispatchMessage(Handler.java:92) 
07-21 16:07:38.490: ERROR/AndroidRuntime(20768):  at android.os.Looper.loop(Looper.java:132) 
07-21 16:07:38.490: ERROR/AndroidRuntime(20768):  at android.app.ActivityThread.main(ActivityThread.java:4028) 
07-21 16:07:38.490: ERROR/AndroidRuntime(20768):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-21 16:07:38.490: ERROR/AndroidRuntime(20768):  at java.lang.reflect.Method.invoke(Method.java:491) 
07-21 16:07:38.490: ERROR/AndroidRuntime(20768):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844) 
07-21 16:07:38.490: ERROR/AndroidRuntime(20768):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602) 
07-21 16:07:38.490: ERROR/AndroidRuntime(20768):  at dalvik.system.NativeStart.main(Native Method) 
07-21 16:07:38.500: ERROR/android.os.Debug(292): Dumpstate > /data/log/dumpstate_app_error 

EDIT: código siguiente es el método manuar() en la línea 686:

void drawFrame() { 
      final SurfaceHolder holder = getSurfaceHolder(); 

      Canvas c = null; 
      try { 
       c = holder.lockCanvas(); 
       if (c != null) { 

        drawLogo3(c); 
       } 
      } finally { 
       if (c != null) holder.unlockCanvasAndPost(c); 
      } 

Es un método por defecto Presente en todos los fondos de pantalla en vivo, lo tomé de CubeWallpaper Live Wallpaper Sample de Android SDK.

EDIT 2:

Suena como un error de buffer. Si configuro la velocidad de fotogramas a 10 fps en lugar de a 40 fps, el selector de fondos de pantalla en vivo no se bloquea en absoluto. ¿Es posible editar el comportamiento de Live Wallpaper solo para la actividad "Selector de fondos de pantalla animados"?

+0

¿Podría decirnos qué está pasando en CubeWallpaper1.java línea 686? – mopsled

+0

en la línea 686 está el método predeterminado drawFrame() del fondo de pantalla en vivo, vea el código en la edición anterior. – Mariux

+3

cuando el dispositivo cambia de orientación, todas tus cosas se destruyen y se vuelven a crear. tienes que dar cuenta de eso en tu dibujo ingenuo. el seguimiento de la pila indica que 'unlockCanvasAndPost' está generando la excepción de argumento ilegal. lo hace porque, como se indica en la primera línea de su trazado, la ventana que está tratando de dibujar se destruye y ya no está disponible debido al cambio de orientación. deberías obtener una devolución de llamada del titular de superficie para eso, que probablemente estés ignorando. debes estar preparado para que la superficie se vaya en cualquier momento. –

Respuesta

1

tienen el hilo se unen antes de destruir la superficie

@Override 
public void onSurfaceDestroyed(SurfaceHolder holder) 
{ 
    try 
    { 
     updater.join(); 
    } 
    catch (InterruptedException e) 
    { 

    } 
    super.onSurfaceDestroyed(holder); 
} 
1

cuando se cambia la orientación del dispositivo, el "onsurfacechange()" función called.you debe hacer somthing There.I adivinar el cuando se cambia el orientant el "surfaceholder" también cambió. Lo hago como:

@Override 
     public void onSurfaceChanged(SurfaceHolder holder, int format, 
       int width, int height) { 
         int lockwidth = 0; 
      int lockheight = 0; 
      mholder = holder; 
      try { 

       canvas = mholder.lockCanvas(); 
       lockwidth = canvas.getWidth(); 
       lockheight = canvas.getHeight(); 
       if (width > height) { 
        Utils.Width = lockheight; 
        Utils.screenWidth = lockheight; 
        Utils.screenHeight = lockwidth; 
        Utils.isWidth = true; 
        if (width == 1280 && height == 720 && lockwidth == 800 
          && lockheight == 480) { 
         Utils.screenWidth = 480; 
         Utils.screenHeight = 854; 
        } 
       } else { 
        Utils.Width = lockwidth; 
        Utils.screenWidth = lockwidth; 
        Utils.screenHeight = lockheight; 
        Utils.isWidth = false; 
        if (width == 720 && height == 1280 && lockwidth == 480 
          && lockheight == 800) { 
         Utils.screenWidth = 480; 
         Utils.screenHeight = 854; 
        } 
       } 
       mholder.unlockCanvasAndPost(canvas); 
      } catch (Exception e) { 
      } 
      Utils.rateX = (float) Utils.Width/(float) Utils.FLA_Width; 
      Utils.ratio = Utils.screenWidth/Utils.FLA_Width; 
      Utils.Width = lockwidth; 
      Utils.Height = lockheight; 
     } 
+0

@ Jakie ... ¿Puede decirme para qué sirve Utils? ¿Es una clase? – micky

Cuestiones relacionadas