2013-08-13 3 views
9

Я получаю IllegalStateException: underflow in exception exception,, из-за которого мое приложение терпит крах. Это началось после обновления Android 4.3. На Android 3.0 - 4.2.x он отлично работает.underflow in restore in android 4.3

Исключение происходит на втором

canvas.restore(); 

Приведенное ниже мой рисунок код

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); 
     } 
    } 

Мой вопрос

  1. Каков смысл этой ошибки?
  2. Как исправить эту ошибку?

Stack trace сообщение сгенерировано есть. Линия 165 соответствует второму canvas.restore()

08-13 18: 13: 09,083: Е/AndroidRuntime (14139): неустранимое: резьбы 506 08-13 18: 13: 09,083: Е/AndroidRuntime (14139): java.lang.IllegalStateException: Underflow in restore 08-13 18: 13: 09.083: E/AndroidRuntime (14139): at android.graphics.Canvas.restore (родной метод) 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

Пожалуйста, разместите всю трассировку стека. – CommonsWare

+0

добавлен трассировка стека – prashant

ответ

13

Это ошибка в этом разделе вашего кода:

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

Вы звоните restore() без вызова save() первого. Вам даже не нужен этот звонок для translate(), вы можете просто передать координаты x и y на вызов drawBitmap().

+0

Спасибо. Я попробую это. Не могли бы вы также объяснить, что означает сообщение об исключении? – prashant

+0

Итак, я попробовал ваше предложение, и оно не рушится сейчас. Я также добавил ваше предложение относительно перевода. Я продолжу тестирование некоторых вариантов ОС. Спасибо за ваш ответ. – prashant

+0

Я столкнулся с очень похожими проблемами, за исключением случаев, когда нарушающий код является закрытым источником от стороннего поставщика. Мы в настоящее время преследуем поставщика, чтобы исправить, но между тем есть ли другая альтернатива - например: восстановление поведения sdk 4.2.2 gerrytan

2

общественного аннулируются восстановления()

Добавлено в уровне API 1 Этот вызов уравновешивает предыдущего вызова, чтобы сохранить(), и используется для удаления всех изменений в состоянии матрица/клип с момента последнего сохранения вызова. Ошибка вызова функции restore() еще раз, чем вызывается функция save().