0

Я строю живые обои, у него есть растровое изображение с полным разрешением HD, которое уменьшено до размера экрана телефона пользователя. Он отлично работает на Android 2.2 и 2.3, но падает на 4.0.SurfaceView: dequeueBuffer не удалось на Android 4.0

EDIT:

я сузил проблему немного вниз с помощью TRY/поймать и выяснил, что это исходит из моего метода Run(). С этой МакГайвера исправить это работает около 20 секунд наводнения следующего сообщения об ошибке, а затем выходит из строя:

05-31 20:01:22.590: E/SurfaceTextureClient(1475): dequeueBuffer failed (No such device) 
05-31 20:01:22.590: E/BaseSurfaceHolder(1475): Exception locking surface 
05-31 20:01:22.590: E/BaseSurfaceHolder(1475): java.lang.IllegalArgumentException 
05-31 20:01:22.590: E/BaseSurfaceHolder(1475): at android.view.Surface.lockCanvasNative(Native Method) 
05-31 20:01:22.590: E/BaseSurfaceHolder(1475): at android.view.Surface.lockCanvas(Surface.java:76) 
05-31 20:01:22.590: E/BaseSurfaceHolder(1475): at com.android.internal.view.BaseSurfaceHolder.internalLockCanvas(BaseSurfaceHolder.java:184) 
05-31 20:01:22.590: E/BaseSurfaceHolder(1475): at com.android.internal.view.BaseSurfaceHolder.lockCanvas(BaseSurfaceHolder.java:157) 
05-31 20:01:22.590: E/BaseSurfaceHolder(1475): at com.pelkkala.test.TestWall$TestMachine.run(TestWall.java:255) 
05-31 20:01:22.590: E/BaseSurfaceHolder(1475): at java.lang.Thread.run(Thread.java:856) 
05-31 20:01:22.601: E/ERROR(1475): ERROR IN CODE: java.lang.NullPointerException 
05-31 20:01:22.621: W/System.err(1475): java.lang.NullPointerException 
05-31 20:01:22.621: W/System.err(1475):  at com.pelkkala.test.TestWall$TestMachine.draw(TestWall.java:233) 
05-31 20:01:22.636: W/System.err(1475):  at com.pelkkala.test.TestWall$TestMachine.run(TestWall.java:264) 
05-31 20:01:22.636: W/System.err(1475):  at java.lang.Thread.run(Thread.java:856) 

Вот мой пробег() метод:

 public void run() { 

     while (running) { 
      //perform canvas drawing 
      if (!holder.getSurface().isValid()) { 
       continue; 
      } 

      mTimer = System.currentTimeMillis(); 

      if (mTimer - oldTime > 50) { 
       oldTime = mTimer; 
       try { 
        Canvas c = holder.lockCanvas(); 

        if (!touching) { 
         oscillate(xOrig, yOrig); 
        } 
        if (!touching2) { 
         oscillate2(xOrig2, yOrig2); 
        } 

        draw(c);   
        holder.unlockCanvasAndPost(c); 
       } 
       catch (Exception e) { 
        Log.e("ERROR", "ERROR IN CODE: " + e.toString()); 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

EDIT 2:

Мог это как-то связано с эмулятором? Я не могу получить доступ к устройству Android 4 прямо сейчас, так что это то, что у меня есть.

ответ

0

Я все еще не уверен, почему это происходит с Android 4, но так я решил это.

Это вызывает у меня проблемы:

class TestEngine extends Engine implements Runnable {} 


Так что я изменил его на что-то вроде этого:

class TestEngine extend Engine { 

    private final Runnable testRunnable = new Runnable() { 
     public void run() { 
      drawFrame(); 
     } 
    }; 

    public void drawFrame() { 

     //Draw on canvas and unlock 
     ... 
     mHandler.postDelayed(testRunnable, 1000/50); 
    } 
}