2013-08-13 16 views
9

Otrzymuję IllegalStateException: niedomiar w wyjątku odtwarzania,, który powoduje awarię mojej aplikacji. To zaczęło się dziać po aktualizacji Androida 4.3. Na Android 3.0 - 4.2.x działa dobrze.niedomiar w przywracaniu w systemie Android 4.3

Wyjątkiem dzieje na drugim

canvas.restore(); 

podane poniżej jest mój kod rysunek

private void doDraw(Canvas canvas) { 
     if(mTickerBackGround!=null && (!mTickerBackGround.isRecycled())){ 
      canvas.drawBitmap(mTickerBackGround, 0, 0, null); 
     } 
     if((mBitMapBuffer!=null)){ 
      canvas.save(); 
      canvas.translate(mX, 0); 
      if(!mBitMapBuffer.isRecycled()){ 
       canvas.drawBitmap(mBitMapBuffer, 0, 0, null); 
      } 
      canvas.restore(); 

      if(bitMapWidth+mX<mCanvasWidth){ 
       canvas.translate(bitMapWidth+mX, 0);  
       if(!mBitMapBuffer.isRecycled()){ 
        canvas.drawBitmap(mBitMapBuffer, 0, 0, null); 
       } 
       canvas.restore();     
      } 

      if(bitMapWidth+mX<=0){ 
       mX = 0; 
      }else if(Math.abs(mX)>(bitMapWidth)){     
       mX= mCanvasWidth; 
      } 

      mX-=TickerConstants.SCROLLING_SMOOTHNESS*density;; 
     } 
     if(mLogo!=null && (!mLogo.isRecycled())){ 
      canvas.drawBitmap(mLogo, mCanvasWidth-(60*density), mLogo.getHeight()/6, null); 
     } 
    } 

Moje pytanie jest

  1. Jakie jest znaczenie tego błędu?
  2. Jak naprawić ten błąd?

Wygenerowano komunikat śledzenia stosu. Linia 165 odpowiada drugiej canvas.restore()

08-13 18: 13: 09,083: E/Android Runtime (14139) krytyczny wyjątek: gwintowania 506 13/08 18: 13: 09,083: e/AndroidRuntime (14139): java.lang.IllegalStateException: niedomiar w odtwarzaniu 08-13 18: 13: 09.083: E/AndroidRuntime (14139): o android.graphics.Canvas.restore (metoda macierzysta) 08-13 18: 13: 09.083: E/AndroidRuntime (14139): at com.my.package.name.ticker.TickerSurfaceView $ TickerThread.doDraw (TickerSurfaceView.java:165) 08-13 18: 13: 09.083: E/AndroidRuntime (14139): at com.my.package.name.ticker.TickerSurfaceView $ TickerThread.run (TickerSurfaceView.java:128)

+0

Proszę zaksięgować cały ślad stosu. – CommonsWare

+0

dodano ślad stosu – prashant

Odpowiedz

13

Błąd jest w tej części kodu:

if(bitMapWidth+mX<mCanvasWidth){ 
     canvas.translate(bitMapWidth+mX, 0);  
     if(!mBitMapBuffer.isRecycled()){ 
      canvas.drawBitmap(mBitMapBuffer, 0, 0, null); 
     } 
     canvas.restore();     
    } 

Telefonujesz restore() bez wywoływania save() pierwszy. Nawet nie potrzebujesz tego połączenia z translate(), możesz po prostu przekazać współrzędne xiy do połączenia drawBitmap().

+0

Dzięki. Spróbuję tego. Czy możesz również wyjaśnić, co oznacza komunikat o wyjątku? – prashant

+0

Więc wypróbowałem twoją sugestię i teraz się nie rozbija. Włączyłem również Twoją sugestię dotyczącą połączenia z tłumaczeniem. Będę kontynuować testowanie na niektórych odmianach systemu operacyjnego. Dzięki za twoją odpowiedź. – prashant

+0

Napotkałem bardzo podobny problem, z tym że w moim przypadku kod naruszający prawa jest zamknięty-źródło od zewnętrznego dostawcy. Aktualnie ścigamy sprzedawcę, aby naprawić, ale w międzyczasie jest jakakolwiek inna alternatywa - np. Przywracanie zachowania sdk 4.2.2 gerrytan

2

public void restore()

Dodane w poziomie API 1 toll równoważy poprzednią wezwanie do zapisywania() i służy do usuwania wszystkich zmianach stanu matryca/Klip od ostatniego zapisu rozmowy. Błąd wywoływania funkcji restore() więcej razy niż wywołanie save().

Powiązane problemy