2011-07-21 3 views
5

Я разрабатываю Live Wallpaper для Honeycomb 3.0, но получаю случайную ошибку.IllegalArgumentException при вращении устройства в Live Wallpaper picker Android 3.0

Когда я нахожусь в подборщике обоев (окно с кнопками «Установить обои» и «Настройки ...», чтобы понять), и отображается «Живые обои», если я поворачиваю устройство, обои должны перезаряжаться с помощью конфигурация адаптирована для новой ориентации. Иногда это происходит, иногда он падает.

Ошибка в некотором роде связана с BaseSurfaceHolder.unlockCanvasAndPost метод, но я действительно не знаю, была проблема. Я думаю, что он не может правильно загрузить некоторые ресурсы ..

Вот журнал ошибок:

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: код ниже метод drawFrame() в строке 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); 
      } 

Это метод по умолчанию ppresent во всех живых обоях, я взял его из CubeWallpaper Live Wallpaper Sample из Android SDK.

EDIT 2:

Это звучит как ошибка буфера. Если я установил частоту кадров в 10 кадров в секунду вместо 40 кадров в секунду, Live Picker не будет аварийно завершен. Возможно ли изменить действие Live Wallpaper только для Activity «Live Wallpaper Picker»?

+0

Не могли бы вы рассказать нам, что происходит на CubeWallpaper1.java строке 686? – mopsled

+0

в строке 686 есть стандартный метод drawFrame() по умолчанию, см. Код в приведенном выше правиле. – Mariux

+3

Когда устройство меняет ориентацию, все ваши вещи уничтожаются и воссоздаются. вы должны учитывать это в своем наивном рисунке. трассировка стека указывает на то, что 'unlockCanvasAndPost' генерирует исключение незаконного аргумента. он делает это, потому что, как указано в самой первой строке вашего трассировки, окно, которое вы пытаетесь провести, уничтожается и больше не доступно из-за изменения ориентации. вы должны получить обратный вызов владельца поверхности, который вы, вероятно, игнорируете. вы должны быть готовы к поверхности, чтобы уйти в любое время. –

ответ

1

есть нить присоединиться, прежде чем уничтожить поверхность

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

    } 
    super.onSurfaceDestroyed(holder); 
} 
1

при изменении ориентации устройства, функция «onsurfacechange()» called.you должен сделать Somthing there.I угадать, когда вы измените ориентированный «поверхностный держатель» также изменился. Мне это нравится:

@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..Can u скажите мне, что это значит для Utils? Это класс? – micky